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..36f1e73f4 --- /dev/null +++ b/api/0.11/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
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/bdwn.png b/api/0.11/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/api/0.11/bdwn.png differ diff --git a/api/0.11/classes.html b/api/0.11/classes.html new file mode 100644 index 000000000..780bd1ef4 --- /dev/null +++ b/api/0.11/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
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..09d68a148 --- /dev/null +++ b/api/0.11/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,94 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
include Directory Reference
+
+
+ + + + + + + + + + + + + + +

+Files

file  xcm.h [code]
 This file contains the core Extensible Connection-oriented Messaging (XCM) API.
 
file  xcm_addr.h [code]
 This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
 
file  xcm_attr.h [code]
 This file contains the XCM attribute access API. See Socket Attributes for an overview.
 
file  xcm_attr_types.h [code]
 This file contains type definitions for the XCM attribute access API.
 
+
+ + + + diff --git a/api/0.11/doc.png b/api/0.11/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/api/0.11/doc.png differ diff --git a/api/0.11/doxygen.css b/api/0.11/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/api/0.11/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/api/0.11/doxygen.svg b/api/0.11/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/api/0.11/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.11/dynsections.js b/api/0.11/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/api/0.11/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
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.png b/api/0.11/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/api/0.11/folderclosed.png differ diff --git a/api/0.11/folderopen.png b/api/0.11/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/api/0.11/folderopen.png differ diff --git a/api/0.11/functions.html b/api/0.11/functions.html new file mode 100644 index 000000000..e45a6b8b4 --- /dev/null +++ b/api/0.11/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
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..aa5ea7e48 --- /dev/null +++ b/api/0.11/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/api/0.11/globals.html b/api/0.11/globals.html new file mode 100644 index 000000000..6d17d0c69 --- /dev/null +++ b/api/0.11/globals.html @@ -0,0 +1,212 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
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..b3343d517 --- /dev/null +++ b/api/0.11/globals_defs.html @@ -0,0 +1,111 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/api/0.11/globals_enum.html b/api/0.11/globals_enum.html new file mode 100644 index 000000000..0090b05b8 --- /dev/null +++ b/api/0.11/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/api/0.11/globals_eval.html b/api/0.11/globals_eval.html new file mode 100644 index 000000000..64a49ee07 --- /dev/null +++ b/api/0.11/globals_eval.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/api/0.11/globals_func.html b/api/0.11/globals_func.html new file mode 100644 index 000000000..472034ea6 --- /dev/null +++ b/api/0.11/globals_func.html @@ -0,0 +1,156 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/api/0.11/globals_type.html b/api/0.11/globals_type.html new file mode 100644 index 000000000..a02ff6300 --- /dev/null +++ b/api/0.11/globals_type.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/api/0.11/group__api__version.html b/api/0.11/group__api__version.html new file mode 100644 index 000000000..f1f415f35 --- /dev/null +++ b/api/0.11/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+ +
+
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..990209c97 --- /dev/null +++ b/api/0.11/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+ +
+
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..7421539c0 --- /dev/null +++ b/api/0.11/index.html @@ -0,0 +1,409 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
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/jquery.js b/api/0.11/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/api/0.11/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
"),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/api/0.11/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/api/0.11/modules.html new file mode 100644 index 000000000..6e4ef3786 --- /dev/null +++ b/api/0.11/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_buffering.png b/api/0.11/nb_buffering.png new file mode 100644 index 000000000..2cb20627b 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..35adc95ff 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..f7b39bc66 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..2ceff6ebb 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..3988b1eb2 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..a5197e3c2 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/search/all_0.html b/api/0.11/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/api/0.11/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.11/search/all_0.js b/api/0.11/search/all_0.js new file mode 100644 index 000000000..7130f6379 --- /dev/null +++ b/api/0.11/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.11/search/all_1.html b/api/0.11/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/api/0.11/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.11/search/all_1.js b/api/0.11/search/all_1.js new file mode 100644 index 000000000..69f82ad46 --- /dev/null +++ b/api/0.11/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.11/search/all_2.html b/api/0.11/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/api/0.11/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.11/search/all_2.js b/api/0.11/search/all_2.js new file mode 100644 index 000000000..ae6e4d753 --- /dev/null +++ b/api/0.11/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.11/search/all_3.html b/api/0.11/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/api/0.11/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.11/search/all_3.js b/api/0.11/search/all_3.js new file mode 100644 index 000000000..551054f77 --- /dev/null +++ b/api/0.11/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.11/search/all_4.html b/api/0.11/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/api/0.11/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.11/search/all_4.js b/api/0.11/search/all_4.js new file mode 100644 index 000000000..fd3d5a006 --- /dev/null +++ b/api/0.11/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.11/search/all_5.html b/api/0.11/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/api/0.11/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.11/search/all_5.js b/api/0.11/search/all_5.js new file mode 100644 index 000000000..6e3cddef7 --- /dev/null +++ b/api/0.11/search/all_5.js @@ -0,0 +1,55 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faddr_2eh_8',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_9',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_10',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['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_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_5ftype_28',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_29',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_30',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_31',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_32',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcleanup_33',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_34',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_35',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5ffd_5fexception_36',['XCM_FD_EXCEPTION',['../xcm_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm.h']]], + ['xcm_5ffd_5freadable_37',['XCM_FD_READABLE',['../xcm_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm.h']]], + ['xcm_5ffd_5fwritable_38',['XCM_FD_WRITABLE',['../xcm_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm.h']]], + ['xcm_5ffinish_39',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_40',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_41',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_42',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',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#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_45',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_46',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_47',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fset_5fblocking_48',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_49',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_50',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_51',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_52',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_53',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_54',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_55',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_56',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_57',['xcm_want',['../xcm_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm.h']]] +]; diff --git a/api/0.11/search/all_6.html b/api/0.11/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/api/0.11/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.11/search/all_6.js b/api/0.11/search/all_6.js new file mode 100644 index 000000000..5411ca92b --- /dev/null +++ b/api/0.11/search/all_6.js @@ -0,0 +1,109 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_14',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_15',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_16',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_17',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_18',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_19',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_20',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_21',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_22',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_23',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_24',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_25',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_26',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_27',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_28',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_29',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_30',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_31',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_32',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_33',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_34',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_35',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_36',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_37',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_38',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_39',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_40',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_41',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_42',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_43',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_44',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_45',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_46',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_47',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_48',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_49',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_50',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_51',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_52',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_53',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_54',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_55',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_56',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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_5fint64_60',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_61',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_62',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_63',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_64',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',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_5fbtls_5fproto_69',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_70',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_71',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_72',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_73',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_74',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_75',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_76',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_77',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_78',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_79',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_80',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_81',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_82',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_83',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_84',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_85',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_86',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_87',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_88',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_89',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_90',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_91',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_92',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_93',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_94',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_95',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_96',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_97',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_98',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_99',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_100',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_101',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_102',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_103',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_104',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_105',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_106',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_107',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_108',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_109',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_110',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_111',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_112',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_113',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.11/search/classes_0.html b/api/0.11/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/api/0.11/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.11/search/classes_0.js b/api/0.11/search/classes_0.js new file mode 100644 index 000000000..416f0e2c4 --- /dev/null +++ b/api/0.11/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_58',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_59',['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..a933eea1a --- /dev/null +++ b/api/0.11/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/api/0.11/search/defines_0.html b/api/0.11/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/api/0.11/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.11/search/defines_0.js b/api/0.11/search/defines_0.js new file mode 100644 index 000000000..fd135679f --- /dev/null +++ b/api/0.11/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_102',['XCM_FD_EXCEPTION',['../xcm_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm.h']]], + ['xcm_5ffd_5freadable_103',['XCM_FD_READABLE',['../xcm_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm.h']]], + ['xcm_5ffd_5fwritable_104',['XCM_FD_WRITABLE',['../xcm_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm.h']]], + ['xcm_5fnonblock_105',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_106',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_107',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_108',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_109',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_110',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_111',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_112',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_113',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_114',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.11/search/enums_0.html b/api/0.11/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/api/0.11/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.11/search/enums_0.js b/api/0.11/search/enums_0.js new file mode 100644 index 000000000..408687ef4 --- /dev/null +++ b/api/0.11/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_98',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.11/search/enumvalues_0.html b/api/0.11/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/api/0.11/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.11/search/enumvalues_0.js b/api/0.11/search/enumvalues_0.js new file mode 100644 index 000000000..e886655df --- /dev/null +++ b/api/0.11/search/enumvalues_0.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbool_99',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_100',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_101',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.11/search/files_0.html b/api/0.11/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/api/0.11/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.11/search/files_0.js b/api/0.11/search/files_0.js new file mode 100644 index 000000000..019bd260b --- /dev/null +++ b/api/0.11/search/files_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_2eh_60',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_61',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_62',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_63',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]] +]; diff --git a/api/0.11/search/functions_0.html b/api/0.11/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/api/0.11/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.11/search/functions_0.js b/api/0.11/search/functions_0.js new file mode 100644 index 000000000..a48457acf --- /dev/null +++ b/api/0.11/search/functions_0.js @@ -0,0 +1,31 @@ +var searchData= +[ + ['xcm_5faccept_64',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_65',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_66',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_67',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_68',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_69',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_70',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_71',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_72',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_73',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_74',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_75',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_76',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_77',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_78',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_79',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.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_5fconnect_82',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5ffinish_83',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_84',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_85',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_86',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_87',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_88',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_89',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fset_5fblocking_90',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_91',['xcm_want',['../xcm_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm.h']]] +]; diff --git a/api/0.11/search/groups_0.html b/api/0.11/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/api/0.11/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.11/search/groups_0.js b/api/0.11/search/groups_0.js new file mode 100644 index 000000000..6e8756088 --- /dev/null +++ b/api/0.11/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_218',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.11/search/groups_1.html b/api/0.11/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/api/0.11/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.11/search/groups_1.js b/api/0.11/search/groups_1.js new file mode 100644 index 000000000..b1f6ca015 --- /dev/null +++ b/api/0.11/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_219',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.11/search/mag_sel.svg b/api/0.11/search/mag_sel.svg new file mode 100644 index 000000000..03626f64a --- /dev/null +++ b/api/0.11/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/api/0.11/search/nomatches.html b/api/0.11/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/api/0.11/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/api/0.11/search/pages_0.html b/api/0.11/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/api/0.11/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.11/search/pages_0.js b/api/0.11/search/pages_0.js new file mode 100644 index 000000000..199176a76 --- /dev/null +++ b/api/0.11/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_115',['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..9074198f8 --- /dev/null +++ b/api/0.11/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/api/0.11/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.11/search/typedefs_0.js b/api/0.11/search/typedefs_0.js new file mode 100644 index 000000000..87f26bbca --- /dev/null +++ b/api/0.11/search/typedefs_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_97',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]] +]; diff --git a/api/0.11/search/variables_0.html b/api/0.11/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/api/0.11/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.11/search/variables_0.js b/api/0.11/search/variables_0.js new file mode 100644 index 000000000..577772353 --- /dev/null +++ b/api/0.11/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_92',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.11/search/variables_1.html b/api/0.11/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/api/0.11/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.11/search/variables_1.js b/api/0.11/search/variables_1.js new file mode 100644 index 000000000..cd4ca3468 --- /dev/null +++ b/api/0.11/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_93',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.11/search/variables_2.html b/api/0.11/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/api/0.11/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.11/search/variables_2.js b/api/0.11/search/variables_2.js new file mode 100644 index 000000000..f23dd484a --- /dev/null +++ b/api/0.11/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_94',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_95',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.11/search/variables_3.html b/api/0.11/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/api/0.11/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.11/search/variables_3.js b/api/0.11/search/variables_3.js new file mode 100644 index 000000000..fbecb5ecc --- /dev/null +++ b/api/0.11/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_96',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.11/server_accept.png b/api/0.11/server_accept.png new file mode 100644 index 000000000..9d63cf3ac Binary files /dev/null and b/api/0.11/server_accept.png differ diff --git a/api/0.11/splitbar.png b/api/0.11/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/api/0.11/splitbar.png differ diff --git a/api/0.11/structxcm__addr__host.html b/api/0.11/structxcm__addr__host.html new file mode 100644 index 000000000..b979989b6 --- /dev/null +++ b/api/0.11/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..17532958e --- /dev/null +++ b/api/0.11/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/api/0.11/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/api/0.11/xcm_8h.html b/api/0.11/xcm_8h.html new file mode 100644 index 000000000..7a90f755f --- /dev/null +++ b/api/0.11/xcm_8h.html @@ -0,0 +1,813 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..26171d1ff --- /dev/null +++ b/api/0.11/xcm_8h_source.html @@ -0,0 +1,149 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1029 struct xcm_socket;
    +
    1030 
    +
    1082 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1083 
    +
    1114 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1115 
    +
    1132 int xcm_close(struct xcm_socket *socket);
    +
    1133 
    +
    1153 void xcm_cleanup(struct xcm_socket *socket);
    +
    1154 
    +
    1177 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1178 
    +
    1200 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1201 
    +
    1224 int 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 
    +
    1331 int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    1332  size_t capacity);
    +
    1333 
    +
    1373 int xcm_finish(struct xcm_socket *socket);
    +
    1374 
    +
    1412 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1413 
    +
    1425 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1426 
    +
    1440 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1441 
    +
    1451 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    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..3ffdc3913 --- /dev/null +++ b/api/0.11/xcm__addr_8h.html @@ -0,0 +1,940 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..3b85558d5 --- /dev/null +++ b/api/0.11/xcm__addr_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    39 enum 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];
    +
    58  } addr;
    +
    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 
    +
    88 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89 
    +
    103 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104  uint16_t *port);
    +
    105 
    +
    119 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120  uint16_t *port);
    +
    121 
    +
    136 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137  uint16_t *port);
    +
    138 
    +
    153 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154  uint16_t *port);
    +
    155 
    +
    169 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170 
    +
    184 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185  size_t capacity);
    +
    186 
    +
    202 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203  char *utls_addr_s, size_t capacity);
    +
    204 
    +
    220 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221  char *tls_addr_s, size_t capacity);
    +
    222 
    +
    238 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239  char *tcp_addr_s, size_t capacity);
    +
    240 
    +
    256 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257  char *sctp_addr_s, size_t capacity);
    +
    258 
    +
    273 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274 
    +
    289 int 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..1d289c24e --- /dev/null +++ b/api/0.11/xcm__attr_8h.html @@ -0,0 +1,234 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..7c61be5ef --- /dev/null +++ b/api/0.11/xcm__attr_8h_source.html @@ -0,0 +1,111 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <xcm.h>
    +
    19 #include <xcm_attr_types.h>
    +
    20 #include <stdbool.h>
    +
    21 
    +
    46 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    47  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    48 
    +
    50 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    51  void *value, size_t value_len, void *cb_data);
    +
    52 
    +
    66 void 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..f07f380b3 --- /dev/null +++ b/api/0.11/xcm__attr__map_8h.html @@ -0,0 +1,766 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..0734834eb --- /dev/null +++ b/api/0.11/xcm__attr__map_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name,
    +
    81  bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name,
    +
    95  int64_t attr_value);
    +
    96 
    +
    97 
    +
    107 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108  const char *attr_name,
    +
    109  const char *attr_value);
    +
    110 
    +
    111 
    +
    128 const 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 
    +
    148 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149  const char *attr_name);
    +
    150 
    +
    151 
    +
    166 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167  const char *attr_name);
    +
    168 
    +
    169 
    +
    184 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185  const char *attr_name);
    +
    186 
    +
    195 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196  const char *attr_name);
    +
    197 
    +
    198 
    +
    207 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208 
    +
    209 
    +
    217 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218 
    +
    219 
    +
    223 typedef 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 
    +
    242 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243  xcm_attr_map_foreach_cb cb, void *user);
    +
    244 
    +
    245 
    +
    254 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255  const struct xcm_attr_map *attr_map_b);
    +
    256 
    +
    265 void 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)
    +
    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_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 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 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..91899f3e0 --- /dev/null +++ b/api/0.11/xcm__attr__types_8h.html @@ -0,0 +1,120 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..ffeb6ced3 --- /dev/null +++ b/api/0.11/xcm__attr__types_8h_source.html @@ -0,0 +1,103 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + +
    26 };
    +
    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..42922e2a4 --- /dev/null +++ b/api/0.11/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..c585b1322 --- /dev/null +++ b/api/0.11/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    118 int 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..0f81b8615 --- /dev/null +++ b/api/0.11/xcm__version_8h.html @@ -0,0 +1,372 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..e4c287334 --- /dev/null +++ b/api/0.11/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    47 unsigned int xcm_version_major(void);
    +
    48 
    +
    55 unsigned int xcm_version_minor(void);
    +
    56 
    +
    62 unsigned int xcm_version_patch(void);
    +
    63 
    +
    72 const char *xcm_version(void);
    +
    73 
    +
    79 unsigned int xcm_version_api_major(void);
    +
    80 
    +
    86 unsigned int xcm_version_api_minor(void);
    +
    87 
    +
    96 const char *xcm_version_api(void);
    +
    97 
    +
    98 #ifdef __cplusplus
    +
    99 }
    +
    100 #endif
    +
    101 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..5397edc01 --- /dev/null +++ b/api/0.12/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/api/0.12/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/api/0.12/bdwn.png differ diff --git a/api/0.12/classes.html b/api/0.12/classes.html new file mode 100644 index 000000000..aefb93cf4 --- /dev/null +++ b/api/0.12/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..551af6df7 --- /dev/null +++ b/api/0.12/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,94 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    +
    + + + + diff --git a/api/0.12/doc.png b/api/0.12/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/api/0.12/doc.png differ diff --git a/api/0.12/doxygen.css b/api/0.12/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/api/0.12/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/api/0.12/doxygen.svg b/api/0.12/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/api/0.12/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.12/dynsections.js b/api/0.12/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/api/0.12/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/api/0.12/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/api/0.12/folderclosed.png differ diff --git a/api/0.12/folderopen.png b/api/0.12/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/api/0.12/folderopen.png differ diff --git a/api/0.12/functions.html b/api/0.12/functions.html new file mode 100644 index 000000000..4a2558b30 --- /dev/null +++ b/api/0.12/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..817c412b0 --- /dev/null +++ b/api/0.12/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.12/globals.html b/api/0.12/globals.html new file mode 100644 index 000000000..13c95986b --- /dev/null +++ b/api/0.12/globals.html @@ -0,0 +1,215 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..c26e8cf45 --- /dev/null +++ b/api/0.12/globals_defs.html @@ -0,0 +1,111 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.12/globals_enum.html b/api/0.12/globals_enum.html new file mode 100644 index 000000000..8ba8e7a9b --- /dev/null +++ b/api/0.12/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.12/globals_eval.html b/api/0.12/globals_eval.html new file mode 100644 index 000000000..6e06e92fc --- /dev/null +++ b/api/0.12/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.12/globals_func.html b/api/0.12/globals_func.html new file mode 100644 index 000000000..da5b4657a --- /dev/null +++ b/api/0.12/globals_func.html @@ -0,0 +1,156 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.12/globals_type.html b/api/0.12/globals_type.html new file mode 100644 index 000000000..6f3a03d45 --- /dev/null +++ b/api/0.12/globals_type.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.12/group__api__version.html b/api/0.12/group__api__version.html new file mode 100644 index 000000000..f1f415f35 --- /dev/null +++ b/api/0.12/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..990209c97 --- /dev/null +++ b/api/0.12/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..f14048bd0 --- /dev/null +++ b/api/0.12/index.html @@ -0,0 +1,418 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/jquery.js b/api/0.12/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/api/0.12/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/api/0.12/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/api/0.12/modules.html new file mode 100644 index 000000000..6e4ef3786 --- /dev/null +++ b/api/0.12/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_buffering.png b/api/0.12/nb_buffering.png new file mode 100644 index 000000000..2cb20627b 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..35adc95ff 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..f7b39bc66 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..2ceff6ebb 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..3988b1eb2 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..a5197e3c2 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/search/all_0.html b/api/0.12/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/api/0.12/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.12/search/all_0.js b/api/0.12/search/all_0.js new file mode 100644 index 000000000..7130f6379 --- /dev/null +++ b/api/0.12/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.12/search/all_1.html b/api/0.12/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/api/0.12/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.12/search/all_1.js b/api/0.12/search/all_1.js new file mode 100644 index 000000000..69f82ad46 --- /dev/null +++ b/api/0.12/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.12/search/all_2.html b/api/0.12/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/api/0.12/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.12/search/all_2.js b/api/0.12/search/all_2.js new file mode 100644 index 000000000..ae6e4d753 --- /dev/null +++ b/api/0.12/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.12/search/all_3.html b/api/0.12/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/api/0.12/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.12/search/all_3.js b/api/0.12/search/all_3.js new file mode 100644 index 000000000..551054f77 --- /dev/null +++ b/api/0.12/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.12/search/all_4.html b/api/0.12/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/api/0.12/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.12/search/all_4.js b/api/0.12/search/all_4.js new file mode 100644 index 000000000..fd3d5a006 --- /dev/null +++ b/api/0.12/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.12/search/all_5.html b/api/0.12/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/api/0.12/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.12/search/all_5.js b/api/0.12/search/all_5.js new file mode 100644 index 000000000..bd59f9280 --- /dev/null +++ b/api/0.12/search/all_5.js @@ -0,0 +1,56 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faddr_2eh_8',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_9',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_10',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['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_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_5ftype_28',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_29',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_30',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_31',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_32',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_33',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcleanup_34',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_35',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_36',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5ffd_5fexception_37',['XCM_FD_EXCEPTION',['../xcm_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm.h']]], + ['xcm_5ffd_5freadable_38',['XCM_FD_READABLE',['../xcm_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm.h']]], + ['xcm_5ffd_5fwritable_39',['XCM_FD_WRITABLE',['../xcm_8h.html#abb5f23cfc23562bae00923bdb06e7e23',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#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_43',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_44',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_45',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_46',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_47',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_48',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fset_5fblocking_49',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_50',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_51',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_52',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_53',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_54',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_55',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_56',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_57',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_58',['xcm_want',['../xcm_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm.h']]] +]; diff --git a/api/0.12/search/all_6.html b/api/0.12/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/api/0.12/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.12/search/all_6.js b/api/0.12/search/all_6.js new file mode 100644 index 000000000..5411ca92b --- /dev/null +++ b/api/0.12/search/all_6.js @@ -0,0 +1,109 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_14',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_15',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_16',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_17',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_18',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_19',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_20',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_21',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_22',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_23',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_24',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_25',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_26',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_27',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_28',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_29',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_30',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_31',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_32',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_33',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_34',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_35',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_36',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_37',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_38',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_39',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_40',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_41',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_42',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_43',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_44',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_45',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_46',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_47',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_48',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_49',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_50',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_51',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_52',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_53',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_54',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_55',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_56',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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_5fint64_60',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_61',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_62',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_63',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_64',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',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_5fbtls_5fproto_69',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_70',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_71',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_72',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_73',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_74',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_75',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_76',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_77',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_78',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_79',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_80',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_81',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_82',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_83',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_84',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_85',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_86',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_87',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_88',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_89',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_90',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_91',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_92',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_93',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_94',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_95',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_96',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_97',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_98',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_99',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_100',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_101',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_102',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_103',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_104',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_105',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_106',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_107',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_108',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_109',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_110',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_111',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_112',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_113',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.12/search/classes_0.html b/api/0.12/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/api/0.12/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.12/search/classes_0.js b/api/0.12/search/classes_0.js new file mode 100644 index 000000000..d3907deb4 --- /dev/null +++ b/api/0.12/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_59',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_60',['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..a933eea1a --- /dev/null +++ b/api/0.12/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/api/0.12/search/defines_0.html b/api/0.12/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/api/0.12/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.12/search/defines_0.js b/api/0.12/search/defines_0.js new file mode 100644 index 000000000..cd9a168ca --- /dev/null +++ b/api/0.12/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_104',['XCM_FD_EXCEPTION',['../xcm_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm.h']]], + ['xcm_5ffd_5freadable_105',['XCM_FD_READABLE',['../xcm_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm.h']]], + ['xcm_5ffd_5fwritable_106',['XCM_FD_WRITABLE',['../xcm_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm.h']]], + ['xcm_5fnonblock_107',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_108',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_109',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_110',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_111',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_112',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_113',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_114',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_115',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_116',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.12/search/enums_0.html b/api/0.12/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/api/0.12/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.12/search/enums_0.js b/api/0.12/search/enums_0.js new file mode 100644 index 000000000..ccda7c2be --- /dev/null +++ b/api/0.12/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_99',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.12/search/enumvalues_0.html b/api/0.12/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/api/0.12/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.12/search/enumvalues_0.js b/api/0.12/search/enumvalues_0.js new file mode 100644 index 000000000..88df9bf05 --- /dev/null +++ b/api/0.12/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_100',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_101',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_102',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_103',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.12/search/files_0.html b/api/0.12/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/api/0.12/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.12/search/files_0.js b/api/0.12/search/files_0.js new file mode 100644 index 000000000..c3713bd19 --- /dev/null +++ b/api/0.12/search/files_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_2eh_61',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_62',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_63',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_64',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]] +]; diff --git a/api/0.12/search/functions_0.html b/api/0.12/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/api/0.12/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.12/search/functions_0.js b/api/0.12/search/functions_0.js new file mode 100644 index 000000000..00b55f25c --- /dev/null +++ b/api/0.12/search/functions_0.js @@ -0,0 +1,31 @@ +var searchData= +[ + ['xcm_5faccept_65',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_66',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_67',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_68',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_69',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_70',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_71',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_72',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_73',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_74',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_75',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_76',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_77',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_78',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_79',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_80',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fcleanup_81',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_82',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_83',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5ffinish_84',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_85',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_86',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_87',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_88',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_89',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_90',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fset_5fblocking_91',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_92',['xcm_want',['../xcm_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm.h']]] +]; diff --git a/api/0.12/search/groups_0.html b/api/0.12/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/api/0.12/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.12/search/groups_0.js b/api/0.12/search/groups_0.js new file mode 100644 index 000000000..6e8756088 --- /dev/null +++ b/api/0.12/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_218',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.12/search/groups_1.html b/api/0.12/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/api/0.12/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.12/search/groups_1.js b/api/0.12/search/groups_1.js new file mode 100644 index 000000000..b1f6ca015 --- /dev/null +++ b/api/0.12/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_219',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.12/search/mag_sel.svg b/api/0.12/search/mag_sel.svg new file mode 100644 index 000000000..03626f64a --- /dev/null +++ b/api/0.12/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/api/0.12/search/nomatches.html b/api/0.12/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/api/0.12/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/api/0.12/search/pages_0.html b/api/0.12/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/api/0.12/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.12/search/pages_0.js b/api/0.12/search/pages_0.js new file mode 100644 index 000000000..987555e5a --- /dev/null +++ b/api/0.12/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_117',['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..9074198f8 --- /dev/null +++ b/api/0.12/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/api/0.12/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.12/search/typedefs_0.js b/api/0.12/search/typedefs_0.js new file mode 100644 index 000000000..1c64d3cef --- /dev/null +++ b/api/0.12/search/typedefs_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_98',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]] +]; diff --git a/api/0.12/search/variables_0.html b/api/0.12/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/api/0.12/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.12/search/variables_0.js b/api/0.12/search/variables_0.js new file mode 100644 index 000000000..afc6aac2a --- /dev/null +++ b/api/0.12/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_93',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.12/search/variables_1.html b/api/0.12/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/api/0.12/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.12/search/variables_1.js b/api/0.12/search/variables_1.js new file mode 100644 index 000000000..8e5c9b7dc --- /dev/null +++ b/api/0.12/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_94',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.12/search/variables_2.html b/api/0.12/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/api/0.12/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.12/search/variables_2.js b/api/0.12/search/variables_2.js new file mode 100644 index 000000000..795c63859 --- /dev/null +++ b/api/0.12/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_95',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_96',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.12/search/variables_3.html b/api/0.12/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/api/0.12/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.12/search/variables_3.js b/api/0.12/search/variables_3.js new file mode 100644 index 000000000..d98bf870c --- /dev/null +++ b/api/0.12/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_97',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.12/server_accept.png b/api/0.12/server_accept.png new file mode 100644 index 000000000..9d63cf3ac Binary files /dev/null and b/api/0.12/server_accept.png differ diff --git a/api/0.12/splitbar.png b/api/0.12/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/api/0.12/splitbar.png differ diff --git a/api/0.12/structxcm__addr__host.html b/api/0.12/structxcm__addr__host.html new file mode 100644 index 000000000..fb86a9cc8 --- /dev/null +++ b/api/0.12/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..0c78c9a22 --- /dev/null +++ b/api/0.12/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/api/0.12/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/api/0.12/xcm_8h.html b/api/0.12/xcm_8h.html new file mode 100644 index 000000000..07aa804b1 --- /dev/null +++ b/api/0.12/xcm_8h.html @@ -0,0 +1,813 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..8c5d6dab5 --- /dev/null +++ b/api/0.12/xcm_8h_source.html @@ -0,0 +1,149 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1057 struct xcm_socket;
    +
    1058 
    +
    1110 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1111 
    +
    1142 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1143 
    +
    1160 int xcm_close(struct xcm_socket *socket);
    +
    1161 
    +
    1181 void xcm_cleanup(struct xcm_socket *socket);
    +
    1182 
    +
    1205 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1206 
    +
    1228 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1229 
    +
    1252 int 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 
    +
    1359 int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    1360  size_t capacity);
    +
    1361 
    +
    1401 int xcm_finish(struct xcm_socket *socket);
    +
    1402 
    +
    1440 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1441 
    +
    1453 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1454 
    +
    1468 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1469 
    +
    1479 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    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..36bc00d69 --- /dev/null +++ b/api/0.12/xcm__addr_8h.html @@ -0,0 +1,940 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..b6c9ef7e6 --- /dev/null +++ b/api/0.12/xcm__addr_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    39 enum 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];
    +
    58  } addr;
    +
    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 
    +
    88 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89 
    +
    103 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104  uint16_t *port);
    +
    105 
    +
    119 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120  uint16_t *port);
    +
    121 
    +
    136 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137  uint16_t *port);
    +
    138 
    +
    153 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154  uint16_t *port);
    +
    155 
    +
    169 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170 
    +
    184 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185  size_t capacity);
    +
    186 
    +
    202 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203  char *utls_addr_s, size_t capacity);
    +
    204 
    +
    220 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221  char *tls_addr_s, size_t capacity);
    +
    222 
    +
    238 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239  char *tcp_addr_s, size_t capacity);
    +
    240 
    +
    256 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257  char *sctp_addr_s, size_t capacity);
    +
    258 
    +
    273 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274 
    +
    289 int 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..fe3d31d18 --- /dev/null +++ b/api/0.12/xcm__attr_8h.html @@ -0,0 +1,234 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..7afd681c9 --- /dev/null +++ b/api/0.12/xcm__attr_8h_source.html @@ -0,0 +1,111 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <xcm.h>
    +
    19 #include <xcm_attr_types.h>
    +
    20 #include <stdbool.h>
    +
    21 
    +
    46 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    47  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    48 
    +
    50 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    51  void *value, size_t value_len, void *cb_data);
    +
    52 
    +
    66 void 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..f07f380b3 --- /dev/null +++ b/api/0.12/xcm__attr__map_8h.html @@ -0,0 +1,766 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..0734834eb --- /dev/null +++ b/api/0.12/xcm__attr__map_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name,
    +
    81  bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name,
    +
    95  int64_t attr_value);
    +
    96 
    +
    97 
    +
    107 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108  const char *attr_name,
    +
    109  const char *attr_value);
    +
    110 
    +
    111 
    +
    128 const 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 
    +
    148 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149  const char *attr_name);
    +
    150 
    +
    151 
    +
    166 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167  const char *attr_name);
    +
    168 
    +
    169 
    +
    184 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185  const char *attr_name);
    +
    186 
    +
    195 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196  const char *attr_name);
    +
    197 
    +
    198 
    +
    207 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208 
    +
    209 
    +
    217 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218 
    +
    219 
    +
    223 typedef 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 
    +
    242 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243  xcm_attr_map_foreach_cb cb, void *user);
    +
    244 
    +
    245 
    +
    254 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255  const struct xcm_attr_map *attr_map_b);
    +
    256 
    +
    265 void 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)
    +
    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_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 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 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..97f0c08d2 --- /dev/null +++ b/api/0.12/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..f1a94f5a7 --- /dev/null +++ b/api/0.12/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..42922e2a4 --- /dev/null +++ b/api/0.12/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..c585b1322 --- /dev/null +++ b/api/0.12/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    118 int 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..0f81b8615 --- /dev/null +++ b/api/0.12/xcm__version_8h.html @@ -0,0 +1,372 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..e4c287334 --- /dev/null +++ b/api/0.12/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    47 unsigned int xcm_version_major(void);
    +
    48 
    +
    55 unsigned int xcm_version_minor(void);
    +
    56 
    +
    62 unsigned int xcm_version_patch(void);
    +
    63 
    +
    72 const char *xcm_version(void);
    +
    73 
    +
    79 unsigned int xcm_version_api_major(void);
    +
    80 
    +
    86 unsigned int xcm_version_api_minor(void);
    +
    87 
    +
    96 const char *xcm_version_api(void);
    +
    97 
    +
    98 #ifdef __cplusplus
    +
    99 }
    +
    100 #endif
    +
    101 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..b16cfb6e6 --- /dev/null +++ b/api/0.13/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/api/0.13/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/api/0.13/bdwn.png differ diff --git a/api/0.13/classes.html b/api/0.13/classes.html new file mode 100644 index 000000000..4fb067dd5 --- /dev/null +++ b/api/0.13/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..25c065faf --- /dev/null +++ b/api/0.13/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,97 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/api/0.13/doc.png b/api/0.13/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/api/0.13/doc.png differ diff --git a/api/0.13/doxygen.css b/api/0.13/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/api/0.13/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/api/0.13/doxygen.svg b/api/0.13/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/api/0.13/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.13/dynsections.js b/api/0.13/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/api/0.13/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/api/0.13/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/api/0.13/folderclosed.png differ diff --git a/api/0.13/folderopen.png b/api/0.13/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/api/0.13/folderopen.png differ diff --git a/api/0.13/functions.html b/api/0.13/functions.html new file mode 100644 index 000000000..deeac4690 --- /dev/null +++ b/api/0.13/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..5ccbb583b --- /dev/null +++ b/api/0.13/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.13/globals.html b/api/0.13/globals.html new file mode 100644 index 000000000..b229cacd1 --- /dev/null +++ b/api/0.13/globals.html @@ -0,0 +1,221 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..dd3cdb8df --- /dev/null +++ b/api/0.13/globals_defs.html @@ -0,0 +1,111 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.13/globals_enum.html b/api/0.13/globals_enum.html new file mode 100644 index 000000000..ba1a657f6 --- /dev/null +++ b/api/0.13/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.13/globals_eval.html b/api/0.13/globals_eval.html new file mode 100644 index 000000000..d46af9519 --- /dev/null +++ b/api/0.13/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.13/globals_func.html b/api/0.13/globals_func.html new file mode 100644 index 000000000..e87b9c4e7 --- /dev/null +++ b/api/0.13/globals_func.html @@ -0,0 +1,162 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.13/globals_type.html b/api/0.13/globals_type.html new file mode 100644 index 000000000..f05d3613a --- /dev/null +++ b/api/0.13/globals_type.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.13/group__api__version.html b/api/0.13/group__api__version.html new file mode 100644 index 000000000..f1f415f35 --- /dev/null +++ b/api/0.13/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..990209c97 --- /dev/null +++ b/api/0.13/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..88c5a088b --- /dev/null +++ b/api/0.13/index.html @@ -0,0 +1,397 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/jquery.js b/api/0.13/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/api/0.13/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/api/0.13/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/api/0.13/modules.html new file mode 100644 index 000000000..6e4ef3786 --- /dev/null +++ b/api/0.13/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/api/0.13/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..32c9e08d3 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/api/0.13/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/api/0.13/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.13/search/all_0.js b/api/0.13/search/all_0.js new file mode 100644 index 000000000..7130f6379 --- /dev/null +++ b/api/0.13/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.13/search/all_1.html b/api/0.13/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/api/0.13/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.13/search/all_1.js b/api/0.13/search/all_1.js new file mode 100644 index 000000000..69f82ad46 --- /dev/null +++ b/api/0.13/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.13/search/all_2.html b/api/0.13/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/api/0.13/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.13/search/all_2.js b/api/0.13/search/all_2.js new file mode 100644 index 000000000..ae6e4d753 --- /dev/null +++ b/api/0.13/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.13/search/all_3.html b/api/0.13/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/api/0.13/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.13/search/all_3.js b/api/0.13/search/all_3.js new file mode 100644 index 000000000..551054f77 --- /dev/null +++ b/api/0.13/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.13/search/all_4.html b/api/0.13/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/api/0.13/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.13/search/all_4.js b/api/0.13/search/all_4.js new file mode 100644 index 000000000..fd3d5a006 --- /dev/null +++ b/api/0.13/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.13/search/all_5.html b/api/0.13/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/api/0.13/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.13/search/all_5.js b/api/0.13/search/all_5.js new file mode 100644 index 000000000..0bbcd2e51 --- /dev/null +++ b/api/0.13/search/all_5.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faddr_2eh_8',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_9',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_10',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['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_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_5ftype_28',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_29',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_30',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_31',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_32',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_33',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['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_5fcompat_2eh_37',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_38',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5ffd_39',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_40',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_41',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_42',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_43',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_44',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_45',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_46',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_47',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_48',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_49',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_50',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_51',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fset_5fblocking_52',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_53',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_54',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_55',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_56',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_57',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_58',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_59',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_60',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_61',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.13/search/all_6.html b/api/0.13/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/api/0.13/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.13/search/all_6.js b/api/0.13/search/all_6.js new file mode 100644 index 000000000..5411ca92b --- /dev/null +++ b/api/0.13/search/all_6.js @@ -0,0 +1,109 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_14',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_15',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_16',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_17',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_18',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_19',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_20',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_21',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_22',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_23',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_24',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_25',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_26',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_27',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_28',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_29',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_30',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_31',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_32',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_33',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_34',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_35',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_36',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_37',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_38',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_39',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_40',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_41',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_42',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_43',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_44',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_45',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_46',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_47',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_48',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_49',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_50',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_51',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_52',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_53',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_54',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_55',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_56',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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_5fint64_60',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_61',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_62',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_63',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_64',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',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_5fbtls_5fproto_69',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_70',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_71',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_72',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_73',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_74',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_75',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_76',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_77',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_78',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_79',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_80',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_81',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_82',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_83',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_84',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_85',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_86',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_87',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_88',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_89',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_90',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_91',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_92',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_93',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_94',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_95',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_96',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_97',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_98',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_99',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_100',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_101',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_102',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_103',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_104',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_105',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_106',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_107',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_108',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_109',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_110',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_111',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_112',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_113',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.13/search/classes_0.html b/api/0.13/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/api/0.13/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.13/search/classes_0.js b/api/0.13/search/classes_0.js new file mode 100644 index 000000000..3fd236c7f --- /dev/null +++ b/api/0.13/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_62',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_63',['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..a933eea1a --- /dev/null +++ b/api/0.13/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/api/0.13/search/defines_0.html b/api/0.13/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/api/0.13/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.13/search/defines_0.js b/api/0.13/search/defines_0.js new file mode 100644 index 000000000..a38c2a914 --- /dev/null +++ b/api/0.13/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_110',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_111',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_112',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_113',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_114',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_115',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_116',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_117',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_118',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_119',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_120',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_121',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_122',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.13/search/enums_0.html b/api/0.13/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/api/0.13/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.13/search/enums_0.js b/api/0.13/search/enums_0.js new file mode 100644 index 000000000..e9cd8553d --- /dev/null +++ b/api/0.13/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_105',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.13/search/enumvalues_0.html b/api/0.13/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/api/0.13/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.13/search/enumvalues_0.js b/api/0.13/search/enumvalues_0.js new file mode 100644 index 000000000..dd5198a0a --- /dev/null +++ b/api/0.13/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_106',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_107',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_108',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_109',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.13/search/files_0.html b/api/0.13/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/api/0.13/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.13/search/files_0.js b/api/0.13/search/files_0.js new file mode 100644 index 000000000..bdcb0b319 --- /dev/null +++ b/api/0.13/search/files_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_2eh_64',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_65',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_66',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_67',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_68',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/api/0.13/search/functions_0.html b/api/0.13/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/api/0.13/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.13/search/functions_0.js b/api/0.13/search/functions_0.js new file mode 100644 index 000000000..5feca713e --- /dev/null +++ b/api/0.13/search/functions_0.js @@ -0,0 +1,33 @@ +var searchData= +[ + ['xcm_5faccept_69',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_70',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_71',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_72',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_73',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_74',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_75',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_76',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_77',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_78',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_79',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_80',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_81',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_82',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_83',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_84',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fawait_85',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_86',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_87',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_88',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5ffd_89',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_90',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_91',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_92',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_93',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_94',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_95',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_96',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fset_5fblocking_97',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_98',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.13/search/groups_0.html b/api/0.13/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/api/0.13/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.13/search/groups_0.js b/api/0.13/search/groups_0.js new file mode 100644 index 000000000..6e8756088 --- /dev/null +++ b/api/0.13/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_218',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.13/search/groups_1.html b/api/0.13/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/api/0.13/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.13/search/groups_1.js b/api/0.13/search/groups_1.js new file mode 100644 index 000000000..b1f6ca015 --- /dev/null +++ b/api/0.13/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_219',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.13/search/mag_sel.svg b/api/0.13/search/mag_sel.svg new file mode 100644 index 000000000..03626f64a --- /dev/null +++ b/api/0.13/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/api/0.13/search/nomatches.html b/api/0.13/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/api/0.13/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/api/0.13/search/pages_0.html b/api/0.13/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/api/0.13/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.13/search/pages_0.js b/api/0.13/search/pages_0.js new file mode 100644 index 000000000..d54e25172 --- /dev/null +++ b/api/0.13/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_123',['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..9074198f8 --- /dev/null +++ b/api/0.13/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/api/0.13/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.13/search/typedefs_0.js b/api/0.13/search/typedefs_0.js new file mode 100644 index 000000000..94a35a004 --- /dev/null +++ b/api/0.13/search/typedefs_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_104',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]] +]; diff --git a/api/0.13/search/variables_0.html b/api/0.13/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/api/0.13/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.13/search/variables_0.js b/api/0.13/search/variables_0.js new file mode 100644 index 000000000..0512351e5 --- /dev/null +++ b/api/0.13/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_99',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.13/search/variables_1.html b/api/0.13/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/api/0.13/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.13/search/variables_1.js b/api/0.13/search/variables_1.js new file mode 100644 index 000000000..73597899a --- /dev/null +++ b/api/0.13/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_100',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.13/search/variables_2.html b/api/0.13/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/api/0.13/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.13/search/variables_2.js b/api/0.13/search/variables_2.js new file mode 100644 index 000000000..2fdf2b559 --- /dev/null +++ b/api/0.13/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_101',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_102',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.13/search/variables_3.html b/api/0.13/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/api/0.13/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.13/search/variables_3.js b/api/0.13/search/variables_3.js new file mode 100644 index 000000000..3b36e896b --- /dev/null +++ b/api/0.13/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_103',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.13/server_accept.png b/api/0.13/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/api/0.13/server_accept.png differ diff --git a/api/0.13/splitbar.png b/api/0.13/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/api/0.13/splitbar.png differ diff --git a/api/0.13/structxcm__addr__host.html b/api/0.13/structxcm__addr__host.html new file mode 100644 index 000000000..7ca4ee424 --- /dev/null +++ b/api/0.13/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..d0e7ff8b7 --- /dev/null +++ b/api/0.13/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/api/0.13/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/api/0.13/xcm_8h.html b/api/0.13/xcm_8h.html new file mode 100644 index 000000000..85c0c302a --- /dev/null +++ b/api/0.13/xcm_8h.html @@ -0,0 +1,775 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..3b0381071 --- /dev/null +++ b/api/0.13/xcm_8h_source.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    958 struct xcm_socket;
    +
    959 
    +
    1010 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1011 
    +
    1042 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1043 
    +
    1060 int xcm_close(struct xcm_socket *socket);
    +
    1061 
    +
    1081 void xcm_cleanup(struct xcm_socket *socket);
    +
    1082 
    +
    1105 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1106 
    +
    1128 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1129 
    +
    1152 int 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 
    +
    1223 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1224 
    +
    1266 int xcm_fd(struct xcm_socket *socket);
    +
    1267 
    +
    1308 int xcm_finish(struct xcm_socket *socket);
    +
    1309 
    +
    1347 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1348 
    +
    1360 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1361 
    +
    1375 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1376 
    +
    1386 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    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..725ab0563 --- /dev/null +++ b/api/0.13/xcm__addr_8h.html @@ -0,0 +1,940 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..89b0bc551 --- /dev/null +++ b/api/0.13/xcm__addr_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    39 enum 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];
    +
    58  } addr;
    +
    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 
    +
    88 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89 
    +
    103 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104  uint16_t *port);
    +
    105 
    +
    119 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120  uint16_t *port);
    +
    121 
    +
    136 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137  uint16_t *port);
    +
    138 
    +
    153 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154  uint16_t *port);
    +
    155 
    +
    169 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170 
    +
    184 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185  size_t capacity);
    +
    186 
    +
    202 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203  char *utls_addr_s, size_t capacity);
    +
    204 
    +
    220 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221  char *tls_addr_s, size_t capacity);
    +
    222 
    +
    238 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239  char *tcp_addr_s, size_t capacity);
    +
    240 
    +
    256 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257  char *sctp_addr_s, size_t capacity);
    +
    258 
    +
    273 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274 
    +
    289 int 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..747689c91 --- /dev/null +++ b/api/0.13/xcm__attr_8h.html @@ -0,0 +1,234 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..91924f8be --- /dev/null +++ b/api/0.13/xcm__attr_8h_source.html @@ -0,0 +1,111 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <xcm.h>
    +
    19 #include <xcm_attr_types.h>
    +
    20 #include <stdbool.h>
    +
    21 
    +
    46 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    47  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    48 
    +
    50 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    51  void *value, size_t value_len, void *cb_data);
    +
    52 
    +
    66 void 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..f07f380b3 --- /dev/null +++ b/api/0.13/xcm__attr__map_8h.html @@ -0,0 +1,766 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..0734834eb --- /dev/null +++ b/api/0.13/xcm__attr__map_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name,
    +
    81  bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name,
    +
    95  int64_t attr_value);
    +
    96 
    +
    97 
    +
    107 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108  const char *attr_name,
    +
    109  const char *attr_value);
    +
    110 
    +
    111 
    +
    128 const 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 
    +
    148 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149  const char *attr_name);
    +
    150 
    +
    151 
    +
    166 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167  const char *attr_name);
    +
    168 
    +
    169 
    +
    184 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185  const char *attr_name);
    +
    186 
    +
    195 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196  const char *attr_name);
    +
    197 
    +
    198 
    +
    207 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208 
    +
    209 
    +
    217 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218 
    +
    219 
    +
    223 typedef 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 
    +
    242 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243  xcm_attr_map_foreach_cb cb, void *user);
    +
    244 
    +
    245 
    +
    254 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255  const struct xcm_attr_map *attr_map_b);
    +
    256 
    +
    265 void 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)
    +
    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_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 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 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..b1dd28d5c --- /dev/null +++ b/api/0.13/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..d8155f072 --- /dev/null +++ b/api/0.13/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..42922e2a4 --- /dev/null +++ b/api/0.13/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..c585b1322 --- /dev/null +++ b/api/0.13/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    118 int 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..0f81b8615 --- /dev/null +++ b/api/0.13/xcm__version_8h.html @@ -0,0 +1,372 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..e4c287334 --- /dev/null +++ b/api/0.13/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    47 unsigned int xcm_version_major(void);
    +
    48 
    +
    55 unsigned int xcm_version_minor(void);
    +
    56 
    +
    62 unsigned int xcm_version_patch(void);
    +
    63 
    +
    72 const char *xcm_version(void);
    +
    73 
    +
    79 unsigned int xcm_version_api_major(void);
    +
    80 
    +
    86 unsigned int xcm_version_api_minor(void);
    +
    87 
    +
    96 const char *xcm_version_api(void);
    +
    97 
    +
    98 #ifdef __cplusplus
    +
    99 }
    +
    100 #endif
    +
    101 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..f48c111e4 --- /dev/null +++ b/api/0.14/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/api/0.14/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/api/0.14/bdwn.png differ diff --git a/api/0.14/classes.html b/api/0.14/classes.html new file mode 100644 index 000000000..ad31dab2c --- /dev/null +++ b/api/0.14/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..32aa3137e --- /dev/null +++ b/api/0.14/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,100 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/api/0.14/doc.png b/api/0.14/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/api/0.14/doc.png differ diff --git a/api/0.14/doxygen.css b/api/0.14/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/api/0.14/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/api/0.14/doxygen.svg b/api/0.14/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/api/0.14/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.14/dynsections.js b/api/0.14/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/api/0.14/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/api/0.14/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/api/0.14/folderclosed.png differ diff --git a/api/0.14/folderopen.png b/api/0.14/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/api/0.14/folderopen.png differ diff --git a/api/0.14/functions.html b/api/0.14/functions.html new file mode 100644 index 000000000..2fe1ff7b1 --- /dev/null +++ b/api/0.14/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..f239eefe5 --- /dev/null +++ b/api/0.14/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.14/globals.html b/api/0.14/globals.html new file mode 100644 index 000000000..e49f7d4fb --- /dev/null +++ b/api/0.14/globals.html @@ -0,0 +1,284 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..de2a22252 --- /dev/null +++ b/api/0.14/globals_defs.html @@ -0,0 +1,111 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.14/globals_enum.html b/api/0.14/globals_enum.html new file mode 100644 index 000000000..1629534cc --- /dev/null +++ b/api/0.14/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.14/globals_eval.html b/api/0.14/globals_eval.html new file mode 100644 index 000000000..2c14e04af --- /dev/null +++ b/api/0.14/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.14/globals_func.html b/api/0.14/globals_func.html new file mode 100644 index 000000000..46e26e8c4 --- /dev/null +++ b/api/0.14/globals_func.html @@ -0,0 +1,224 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - x -

    +
    + + + + diff --git a/api/0.14/globals_type.html b/api/0.14/globals_type.html new file mode 100644 index 000000000..dde2cfdd8 --- /dev/null +++ b/api/0.14/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.14/group__api__version.html b/api/0.14/group__api__version.html new file mode 100644 index 000000000..f1f415f35 --- /dev/null +++ b/api/0.14/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..990209c97 --- /dev/null +++ b/api/0.14/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..264d91e02 --- /dev/null +++ b/api/0.14/index.html @@ -0,0 +1,488 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/api/0.14/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/api/0.14/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/api/0.14/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/api/0.14/modules.html new file mode 100644 index 000000000..6e4ef3786 --- /dev/null +++ b/api/0.14/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/api/0.14/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..32c9e08d3 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/api/0.14/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/api/0.14/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.14/search/all_0.js b/api/0.14/search/all_0.js new file mode 100644 index 000000000..7130f6379 --- /dev/null +++ b/api/0.14/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.14/search/all_1.html b/api/0.14/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/api/0.14/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.14/search/all_1.js b/api/0.14/search/all_1.js new file mode 100644 index 000000000..69f82ad46 --- /dev/null +++ b/api/0.14/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.14/search/all_2.html b/api/0.14/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/api/0.14/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.14/search/all_2.js b/api/0.14/search/all_2.js new file mode 100644 index 000000000..ae6e4d753 --- /dev/null +++ b/api/0.14/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.14/search/all_3.html b/api/0.14/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/api/0.14/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.14/search/all_3.js b/api/0.14/search/all_3.js new file mode 100644 index 000000000..551054f77 --- /dev/null +++ b/api/0.14/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.14/search/all_4.html b/api/0.14/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/api/0.14/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.14/search/all_4.js b/api/0.14/search/all_4.js new file mode 100644 index 000000000..fd3d5a006 --- /dev/null +++ b/api/0.14/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.14/search/all_5.html b/api/0.14/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/api/0.14/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.14/search/all_5.js b/api/0.14/search/all_5.js new file mode 100644 index 000000000..a8c621511 --- /dev/null +++ b/api/0.14/search/all_5.js @@ -0,0 +1,81 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_8',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_9',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_10',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_11',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_12',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_13',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_14',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_15',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_16',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_17',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_18',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_19',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_20',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_21',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_22',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_23',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_24',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_25',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_26',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_27',['xcm_attr_get',['../xcm__attr_8h.html#a225a543ef40cbfa5da1c860cfbcb4152',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_28',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_35',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_43',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_44',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_45',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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#a24fc9562ced814651160a5783ddb21c7',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#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_59',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',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#a4d8d62a9625b49993b7d6ec03de8e765',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#ad52a0d86b7b5bf802835758cc9251e2e',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#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_73',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',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.14/search/all_6.html b/api/0.14/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/api/0.14/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.14/search/all_6.js b/api/0.14/search/all_6.js new file mode 100644 index 000000000..5411ca92b --- /dev/null +++ b/api/0.14/search/all_6.js @@ -0,0 +1,109 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_14',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_15',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_16',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_17',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_18',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_19',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_20',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_21',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_22',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_23',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_24',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_25',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_26',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_27',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_28',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_29',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_30',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_31',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_32',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_33',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_34',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_35',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_36',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_37',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_38',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_39',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_40',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_41',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_42',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_43',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_44',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_45',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_46',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_47',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_48',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_49',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_50',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_51',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_52',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_53',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_54',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_55',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_56',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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_5fint64_60',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_61',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_62',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_63',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_64',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',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_5fbtls_5fproto_69',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_70',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_71',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_72',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_73',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_74',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_75',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_76',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_77',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_78',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_79',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_80',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_81',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_82',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_83',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_84',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_85',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_86',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_87',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_88',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_89',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_90',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_91',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_92',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_93',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_94',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_95',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_96',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_97',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_98',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_99',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_100',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_101',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_102',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_103',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_104',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_105',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_106',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_107',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_108',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_109',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_110',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_111',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_112',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_113',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.14/search/classes_0.html b/api/0.14/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/api/0.14/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.14/search/classes_0.js b/api/0.14/search/classes_0.js new file mode 100644 index 000000000..cbc00d175 --- /dev/null +++ b/api/0.14/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_84',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_85',['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..a933eea1a --- /dev/null +++ b/api/0.14/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/api/0.14/search/defines_0.html b/api/0.14/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/api/0.14/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.14/search/defines_0.js b/api/0.14/search/defines_0.js new file mode 100644 index 000000000..4d19ff23a --- /dev/null +++ b/api/0.14/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_154',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_155',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_156',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_157',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_158',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_159',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_160',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_161',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_162',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_163',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_164',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_165',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_166',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.14/search/enums_0.html b/api/0.14/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/api/0.14/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.14/search/enums_0.js b/api/0.14/search/enums_0.js new file mode 100644 index 000000000..163d58488 --- /dev/null +++ b/api/0.14/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_149',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.14/search/enumvalues_0.html b/api/0.14/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/api/0.14/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.14/search/enumvalues_0.js b/api/0.14/search/enumvalues_0.js new file mode 100644 index 000000000..cd08844af --- /dev/null +++ b/api/0.14/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_150',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_151',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_152',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_153',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.14/search/files_0.html b/api/0.14/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/api/0.14/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.14/search/files_0.js b/api/0.14/search/files_0.js new file mode 100644 index 000000000..ac0e3104a --- /dev/null +++ b/api/0.14/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_86',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_87',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_88',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_89',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_90',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_91',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/api/0.14/search/functions_0.html b/api/0.14/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/api/0.14/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.14/search/functions_0.js b/api/0.14/search/functions_0.js new file mode 100644 index 000000000..39fcdc650 --- /dev/null +++ b/api/0.14/search/functions_0.js @@ -0,0 +1,53 @@ +var searchData= +[ + ['xcm_5faccept_92',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_93',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_94',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_95',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_96',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_97',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_98',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_99',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_100',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_101',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_102',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_103',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_104',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_105',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_106',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_107',['xcm_attr_get',['../xcm__attr_8h.html#a225a543ef40cbfa5da1c860cfbcb4152',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_108',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_109',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_110',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_111',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_112',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_113',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_114',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_115',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_116',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_117',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_118',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_119',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_120',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_121',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_122',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_123',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_124',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_125',['xcm_attr_set',['../xcm__attr_8h.html#a24fc9562ced814651160a5783ddb21c7',1,'xcm_attr.h']]], + ['xcm_5fawait_126',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_127',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_128',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_129',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_130',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_131',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_132',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_133',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_134',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_135',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_136',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_137',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_138',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_139',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_140',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_141',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.14/search/groups_0.html b/api/0.14/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/api/0.14/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.14/search/groups_0.js b/api/0.14/search/groups_0.js new file mode 100644 index 000000000..6e8756088 --- /dev/null +++ b/api/0.14/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_218',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.14/search/groups_1.html b/api/0.14/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/api/0.14/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.14/search/groups_1.js b/api/0.14/search/groups_1.js new file mode 100644 index 000000000..b1f6ca015 --- /dev/null +++ b/api/0.14/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_219',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.14/search/mag_sel.svg b/api/0.14/search/mag_sel.svg new file mode 100644 index 000000000..03626f64a --- /dev/null +++ b/api/0.14/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/api/0.14/search/nomatches.html b/api/0.14/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/api/0.14/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/api/0.14/search/pages_0.html b/api/0.14/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/api/0.14/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.14/search/pages_0.js b/api/0.14/search/pages_0.js new file mode 100644 index 000000000..830144729 --- /dev/null +++ b/api/0.14/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_167',['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..9074198f8 --- /dev/null +++ b/api/0.14/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/api/0.14/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.14/search/typedefs_0.js b/api/0.14/search/typedefs_0.js new file mode 100644 index 000000000..788c04e76 --- /dev/null +++ b/api/0.14/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_147',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_148',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/api/0.14/search/variables_0.html b/api/0.14/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/api/0.14/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.14/search/variables_0.js b/api/0.14/search/variables_0.js new file mode 100644 index 000000000..024ef2f00 --- /dev/null +++ b/api/0.14/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_142',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.14/search/variables_1.html b/api/0.14/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/api/0.14/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.14/search/variables_1.js b/api/0.14/search/variables_1.js new file mode 100644 index 000000000..c71330224 --- /dev/null +++ b/api/0.14/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_143',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.14/search/variables_2.html b/api/0.14/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/api/0.14/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.14/search/variables_2.js b/api/0.14/search/variables_2.js new file mode 100644 index 000000000..de9ed1d6c --- /dev/null +++ b/api/0.14/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_144',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_145',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.14/search/variables_3.html b/api/0.14/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/api/0.14/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.14/search/variables_3.js b/api/0.14/search/variables_3.js new file mode 100644 index 000000000..768caf750 --- /dev/null +++ b/api/0.14/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_146',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.14/server_accept.png b/api/0.14/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/api/0.14/server_accept.png differ diff --git a/api/0.14/splitbar.png b/api/0.14/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/api/0.14/splitbar.png differ diff --git a/api/0.14/structxcm__addr__host.html b/api/0.14/structxcm__addr__host.html new file mode 100644 index 000000000..8e595917e --- /dev/null +++ b/api/0.14/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..b7bd16181 --- /dev/null +++ b/api/0.14/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/api/0.14/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/api/0.14/xcm_8h.html b/api/0.14/xcm_8h.html new file mode 100644 index 000000000..6380a5051 --- /dev/null +++ b/api/0.14/xcm_8h.html @@ -0,0 +1,905 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..6dad3650e --- /dev/null +++ b/api/0.14/xcm_8h_source.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    994 struct xcm_socket;
    +
    995 
    +
    1046 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1047 
    +
    1069 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1070  const struct xcm_attr_map *attrs);
    +
    1071 
    +
    1102 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1103 
    +
    1119 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1120  const struct xcm_attr_map *attrs);
    +
    1121 
    +
    1138 int xcm_close(struct xcm_socket *socket);
    +
    1139 
    +
    1159 void xcm_cleanup(struct xcm_socket *socket);
    +
    1160 
    +
    1183 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1184 
    +
    1201 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1202  const struct xcm_attr_map *attrs);
    +
    1203 
    +
    1225 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1226 
    +
    1249 int 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 
    +
    1320 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1321 
    +
    1363 int xcm_fd(struct xcm_socket *socket);
    +
    1364 
    +
    1405 int xcm_finish(struct xcm_socket *socket);
    +
    1406 
    +
    1447 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1448 
    +
    1463 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1464 
    +
    1481 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1482 
    +
    1497 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..522088838 --- /dev/null +++ b/api/0.14/xcm__addr_8h.html @@ -0,0 +1,940 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..7e50d90c9 --- /dev/null +++ b/api/0.14/xcm__addr_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    39 enum 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];
    +
    58  } addr;
    +
    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 
    +
    88 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89 
    +
    103 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104  uint16_t *port);
    +
    105 
    +
    119 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120  uint16_t *port);
    +
    121 
    +
    136 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137  uint16_t *port);
    +
    138 
    +
    153 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154  uint16_t *port);
    +
    155 
    +
    169 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170 
    +
    184 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185  size_t capacity);
    +
    186 
    +
    202 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203  char *utls_addr_s, size_t capacity);
    +
    204 
    +
    220 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221  char *tls_addr_s, size_t capacity);
    +
    222 
    +
    238 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239  char *tcp_addr_s, size_t capacity);
    +
    240 
    +
    256 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257  char *sctp_addr_s, size_t capacity);
    +
    258 
    +
    273 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274 
    +
    289 int 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..bc6fee1f1 --- /dev/null +++ b/api/0.14/xcm__attr_8h.html @@ -0,0 +1,307 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..8b1f9ebb4 --- /dev/null +++ b/api/0.14/xcm__attr_8h_source.html @@ -0,0 +1,115 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <xcm.h>
    +
    19 #include <xcm_attr_types.h>
    +
    20 #include <stdbool.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *s, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    72 int xcm_attr_get(struct xcm_socket *s, const char *name,
    +
    73  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    74 
    +
    76 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    77  void *value, size_t value_len, void *cb_data);
    +
    78 
    +
    92 void 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..f07f380b3 --- /dev/null +++ b/api/0.14/xcm__attr__map_8h.html @@ -0,0 +1,766 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..0734834eb --- /dev/null +++ b/api/0.14/xcm__attr__map_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name,
    +
    81  bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name,
    +
    95  int64_t attr_value);
    +
    96 
    +
    97 
    +
    107 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108  const char *attr_name,
    +
    109  const char *attr_value);
    +
    110 
    +
    111 
    +
    128 const 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 
    +
    148 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149  const char *attr_name);
    +
    150 
    +
    151 
    +
    166 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167  const char *attr_name);
    +
    168 
    +
    169 
    +
    184 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185  const char *attr_name);
    +
    186 
    +
    195 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196  const char *attr_name);
    +
    197 
    +
    198 
    +
    207 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208 
    +
    209 
    +
    217 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218 
    +
    219 
    +
    223 typedef 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 
    +
    242 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243  xcm_attr_map_foreach_cb cb, void *user);
    +
    244 
    +
    245 
    +
    254 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255  const struct xcm_attr_map *attr_map_b);
    +
    256 
    +
    265 void 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)
    +
    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_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 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 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..4369b0c29 --- /dev/null +++ b/api/0.14/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..b7180b247 --- /dev/null +++ b/api/0.14/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..8a11bb8ff --- /dev/null +++ b/api/0.14/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..95546831e --- /dev/null +++ b/api/0.14/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    118 int 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..0f81b8615 --- /dev/null +++ b/api/0.14/xcm__version_8h.html @@ -0,0 +1,372 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..e4c287334 --- /dev/null +++ b/api/0.14/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    47 unsigned int xcm_version_major(void);
    +
    48 
    +
    55 unsigned int xcm_version_minor(void);
    +
    56 
    +
    62 unsigned int xcm_version_patch(void);
    +
    63 
    +
    72 const char *xcm_version(void);
    +
    73 
    +
    79 unsigned int xcm_version_api_major(void);
    +
    80 
    +
    86 unsigned int xcm_version_api_minor(void);
    +
    87 
    +
    96 const char *xcm_version_api(void);
    +
    97 
    +
    98 #ifdef __cplusplus
    +
    99 }
    +
    100 #endif
    +
    101 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..21fc3b03e --- /dev/null +++ b/api/0.15/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/api/0.15/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/api/0.15/bdwn.png differ diff --git a/api/0.15/classes.html b/api/0.15/classes.html new file mode 100644 index 000000000..646d1a17c --- /dev/null +++ b/api/0.15/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..b0257a9c8 --- /dev/null +++ b/api/0.15/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,100 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/api/0.15/doc.png b/api/0.15/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/api/0.15/doc.png differ diff --git a/api/0.15/doxygen.css b/api/0.15/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/api/0.15/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/api/0.15/doxygen.svg b/api/0.15/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/api/0.15/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.15/dynsections.js b/api/0.15/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/api/0.15/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/api/0.15/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/api/0.15/folderclosed.png differ diff --git a/api/0.15/folderopen.png b/api/0.15/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/api/0.15/folderopen.png differ diff --git a/api/0.15/functions.html b/api/0.15/functions.html new file mode 100644 index 000000000..12107a061 --- /dev/null +++ b/api/0.15/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..21816447a --- /dev/null +++ b/api/0.15/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.15/globals.html b/api/0.15/globals.html new file mode 100644 index 000000000..ea65ad279 --- /dev/null +++ b/api/0.15/globals.html @@ -0,0 +1,302 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..443ddaeca --- /dev/null +++ b/api/0.15/globals_defs.html @@ -0,0 +1,111 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.15/globals_enum.html b/api/0.15/globals_enum.html new file mode 100644 index 000000000..e1a43c2aa --- /dev/null +++ b/api/0.15/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.15/globals_eval.html b/api/0.15/globals_eval.html new file mode 100644 index 000000000..fc806d0f9 --- /dev/null +++ b/api/0.15/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.15/globals_func.html b/api/0.15/globals_func.html new file mode 100644 index 000000000..f48651ce5 --- /dev/null +++ b/api/0.15/globals_func.html @@ -0,0 +1,242 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - x -

    +
    + + + + diff --git a/api/0.15/globals_type.html b/api/0.15/globals_type.html new file mode 100644 index 000000000..f30e6e6f9 --- /dev/null +++ b/api/0.15/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.15/group__api__version.html b/api/0.15/group__api__version.html new file mode 100644 index 000000000..f1f415f35 --- /dev/null +++ b/api/0.15/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..990209c97 --- /dev/null +++ b/api/0.15/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..ae84a3cda --- /dev/null +++ b/api/0.15/index.html @@ -0,0 +1,502 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/api/0.15/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/api/0.15/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/api/0.15/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/api/0.15/modules.html new file mode 100644 index 000000000..6e4ef3786 --- /dev/null +++ b/api/0.15/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/api/0.15/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..32c9e08d3 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/api/0.15/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/api/0.15/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.15/search/all_0.js b/api/0.15/search/all_0.js new file mode 100644 index 000000000..7130f6379 --- /dev/null +++ b/api/0.15/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.15/search/all_1.html b/api/0.15/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/api/0.15/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.15/search/all_1.js b/api/0.15/search/all_1.js new file mode 100644 index 000000000..69f82ad46 --- /dev/null +++ b/api/0.15/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.15/search/all_2.html b/api/0.15/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/api/0.15/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.15/search/all_2.js b/api/0.15/search/all_2.js new file mode 100644 index 000000000..ae6e4d753 --- /dev/null +++ b/api/0.15/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.15/search/all_3.html b/api/0.15/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/api/0.15/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.15/search/all_3.js b/api/0.15/search/all_3.js new file mode 100644 index 000000000..551054f77 --- /dev/null +++ b/api/0.15/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.15/search/all_4.html b/api/0.15/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/api/0.15/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.15/search/all_4.js b/api/0.15/search/all_4.js new file mode 100644 index 000000000..fd3d5a006 --- /dev/null +++ b/api/0.15/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.15/search/all_5.html b/api/0.15/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/api/0.15/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.15/search/all_5.js b/api/0.15/search/all_5.js new file mode 100644 index 000000000..417ba458b --- /dev/null +++ b/api/0.15/search/all_5.js @@ -0,0 +1,87 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_8',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_9',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_10',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_11',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_12',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_13',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_14',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_15',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_16',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_17',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_18',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_19',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_20',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_21',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_22',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_23',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_24',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_25',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_26',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_27',['xcm_attr_get',['../xcm__attr_8h.html#a225a543ef40cbfa5da1c860cfbcb4152',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_28',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_29',['xcm_attr_get_bool',['../xcm__attr_8h.html#af56192a489902f0b672f9d80f727c6db',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_30',['xcm_attr_get_int64',['../xcm__attr_8h.html#a9dc368c8e5800c6427935d5031d377bd',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_31',['xcm_attr_get_str',['../xcm__attr_8h.html#aaae1fd6d48381a5c6b3f301aa93e0db4',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_32',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_33',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_38',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_46',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_47',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_48',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_49',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_50',['xcm_attr_set',['../xcm__attr_8h.html#a24fc9562ced814651160a5783ddb21c7',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_51',['xcm_attr_set_bool',['../xcm__attr_8h.html#ac8033ada81b2a404a803c2d651b2ba60',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_52',['xcm_attr_set_int64',['../xcm__attr_8h.html#a04fd6fe3d498515a5d4979b2bbb42c83',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_53',['xcm_attr_set_str',['../xcm__attr_8h.html#afb84c5dbcc633d9827ab07bd25d5bbd2',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_54',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_55',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_56',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_57',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_58',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_59',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_60',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_61',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_62',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_63',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_64',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_65',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_66',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_67',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_68',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_69',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_70',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_71',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_72',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_73',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_74',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_75',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_76',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_77',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_78',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_79',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_80',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_81',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_82',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_83',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_84',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_85',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_86',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_87',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_88',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_89',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.15/search/all_6.html b/api/0.15/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/api/0.15/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.15/search/all_6.js b/api/0.15/search/all_6.js new file mode 100644 index 000000000..5411ca92b --- /dev/null +++ b/api/0.15/search/all_6.js @@ -0,0 +1,109 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_14',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_15',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_16',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_17',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_18',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_19',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_20',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_21',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_22',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_23',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_24',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_25',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_26',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_27',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_28',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_29',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_30',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_31',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_32',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_33',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_34',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_35',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_36',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_37',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_38',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_39',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_40',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_41',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_42',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_43',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_44',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_45',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_46',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_47',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_48',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_49',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_50',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_51',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_52',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_53',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_54',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_55',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_56',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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_5fint64_60',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_61',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_62',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_63',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_64',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',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_5fbtls_5fproto_69',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_70',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_71',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_72',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_73',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_74',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_75',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_76',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_77',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_78',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_79',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_80',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_81',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_82',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_83',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_84',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_85',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_86',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_87',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_88',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_89',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_90',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_91',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_92',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_93',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_94',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_95',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_96',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_97',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_98',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_99',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_100',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_101',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_102',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_103',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_104',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_105',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_106',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_107',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_108',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_109',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_110',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_111',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_112',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_113',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.15/search/classes_0.html b/api/0.15/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/api/0.15/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.15/search/classes_0.js b/api/0.15/search/classes_0.js new file mode 100644 index 000000000..468741d24 --- /dev/null +++ b/api/0.15/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_90',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_91',['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..a933eea1a --- /dev/null +++ b/api/0.15/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/api/0.15/search/defines_0.html b/api/0.15/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/api/0.15/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.15/search/defines_0.js b/api/0.15/search/defines_0.js new file mode 100644 index 000000000..ed9b81242 --- /dev/null +++ b/api/0.15/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_166',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_167',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_168',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_169',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_170',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_171',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_172',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_173',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_174',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_175',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_176',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_177',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_178',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.15/search/enums_0.html b/api/0.15/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/api/0.15/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.15/search/enums_0.js b/api/0.15/search/enums_0.js new file mode 100644 index 000000000..623970eaa --- /dev/null +++ b/api/0.15/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_161',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.15/search/enumvalues_0.html b/api/0.15/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/api/0.15/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.15/search/enumvalues_0.js b/api/0.15/search/enumvalues_0.js new file mode 100644 index 000000000..bf116ee08 --- /dev/null +++ b/api/0.15/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_162',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_163',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_164',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_165',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.15/search/files_0.html b/api/0.15/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/api/0.15/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.15/search/files_0.js b/api/0.15/search/files_0.js new file mode 100644 index 000000000..d46f54089 --- /dev/null +++ b/api/0.15/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_92',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_93',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_94',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_95',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_96',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_97',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/api/0.15/search/functions_0.html b/api/0.15/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/api/0.15/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.15/search/functions_0.js b/api/0.15/search/functions_0.js new file mode 100644 index 000000000..20a45e4fd --- /dev/null +++ b/api/0.15/search/functions_0.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['xcm_5faccept_98',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_99',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_100',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_101',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_102',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_103',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_104',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_105',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_106',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_107',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_108',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_109',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_110',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_111',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_112',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_113',['xcm_attr_get',['../xcm__attr_8h.html#a225a543ef40cbfa5da1c860cfbcb4152',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_114',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_115',['xcm_attr_get_bool',['../xcm__attr_8h.html#af56192a489902f0b672f9d80f727c6db',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_116',['xcm_attr_get_int64',['../xcm__attr_8h.html#a9dc368c8e5800c6427935d5031d377bd',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_117',['xcm_attr_get_str',['../xcm__attr_8h.html#aaae1fd6d48381a5c6b3f301aa93e0db4',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_118',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_119',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_120',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_121',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_122',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_123',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_124',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_125',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_126',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_127',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_128',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_129',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_130',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_131',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_132',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_133',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_134',['xcm_attr_set',['../xcm__attr_8h.html#a24fc9562ced814651160a5783ddb21c7',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_135',['xcm_attr_set_bool',['../xcm__attr_8h.html#ac8033ada81b2a404a803c2d651b2ba60',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_136',['xcm_attr_set_int64',['../xcm__attr_8h.html#a04fd6fe3d498515a5d4979b2bbb42c83',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_137',['xcm_attr_set_str',['../xcm__attr_8h.html#afb84c5dbcc633d9827ab07bd25d5bbd2',1,'xcm_attr.h']]], + ['xcm_5fawait_138',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_139',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_140',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_141',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_142',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_143',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_144',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_145',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_146',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_147',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_148',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_149',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_150',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_151',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_152',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_153',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.15/search/groups_0.html b/api/0.15/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/api/0.15/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.15/search/groups_0.js b/api/0.15/search/groups_0.js new file mode 100644 index 000000000..6e8756088 --- /dev/null +++ b/api/0.15/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_218',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.15/search/groups_1.html b/api/0.15/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/api/0.15/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.15/search/groups_1.js b/api/0.15/search/groups_1.js new file mode 100644 index 000000000..b1f6ca015 --- /dev/null +++ b/api/0.15/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_219',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.15/search/mag_sel.svg b/api/0.15/search/mag_sel.svg new file mode 100644 index 000000000..03626f64a --- /dev/null +++ b/api/0.15/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/api/0.15/search/nomatches.html b/api/0.15/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/api/0.15/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/api/0.15/search/pages_0.html b/api/0.15/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/api/0.15/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.15/search/pages_0.js b/api/0.15/search/pages_0.js new file mode 100644 index 000000000..c122886e8 --- /dev/null +++ b/api/0.15/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_179',['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..9074198f8 --- /dev/null +++ b/api/0.15/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/api/0.15/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.15/search/typedefs_0.js b/api/0.15/search/typedefs_0.js new file mode 100644 index 000000000..c9347964e --- /dev/null +++ b/api/0.15/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_159',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_160',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/api/0.15/search/variables_0.html b/api/0.15/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/api/0.15/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.15/search/variables_0.js b/api/0.15/search/variables_0.js new file mode 100644 index 000000000..bbc532810 --- /dev/null +++ b/api/0.15/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_154',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.15/search/variables_1.html b/api/0.15/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/api/0.15/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.15/search/variables_1.js b/api/0.15/search/variables_1.js new file mode 100644 index 000000000..25a43a70b --- /dev/null +++ b/api/0.15/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_155',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.15/search/variables_2.html b/api/0.15/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/api/0.15/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.15/search/variables_2.js b/api/0.15/search/variables_2.js new file mode 100644 index 000000000..5313f9bd4 --- /dev/null +++ b/api/0.15/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_156',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_157',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.15/search/variables_3.html b/api/0.15/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/api/0.15/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.15/search/variables_3.js b/api/0.15/search/variables_3.js new file mode 100644 index 000000000..b8a64dacb --- /dev/null +++ b/api/0.15/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_158',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.15/server_accept.png b/api/0.15/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/api/0.15/server_accept.png differ diff --git a/api/0.15/splitbar.png b/api/0.15/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/api/0.15/splitbar.png differ diff --git a/api/0.15/structxcm__addr__host.html b/api/0.15/structxcm__addr__host.html new file mode 100644 index 000000000..97184961b --- /dev/null +++ b/api/0.15/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..c13a0eef4 --- /dev/null +++ b/api/0.15/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/api/0.15/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/api/0.15/xcm_8h.html b/api/0.15/xcm_8h.html new file mode 100644 index 000000000..547efcbcd --- /dev/null +++ b/api/0.15/xcm_8h.html @@ -0,0 +1,905 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..77e26f07f --- /dev/null +++ b/api/0.15/xcm_8h_source.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1006 struct xcm_socket;
    +
    1007 
    +
    1058 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1059 
    +
    1081 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1082  const struct xcm_attr_map *attrs);
    +
    1083 
    +
    1114 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1115 
    +
    1131 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1132  const struct xcm_attr_map *attrs);
    +
    1133 
    +
    1150 int xcm_close(struct xcm_socket *socket);
    +
    1151 
    +
    1171 void xcm_cleanup(struct xcm_socket *socket);
    +
    1172 
    +
    1195 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1196 
    +
    1213 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1214  const struct xcm_attr_map *attrs);
    +
    1215 
    +
    1237 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1238 
    +
    1261 int 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 
    +
    1332 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1333 
    +
    1375 int xcm_fd(struct xcm_socket *socket);
    +
    1376 
    +
    1417 int xcm_finish(struct xcm_socket *socket);
    +
    1418 
    +
    1459 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1460 
    +
    1475 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1476 
    +
    1493 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1494 
    +
    1509 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..e423dde57 --- /dev/null +++ b/api/0.15/xcm__addr_8h.html @@ -0,0 +1,940 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..bbd4577ce --- /dev/null +++ b/api/0.15/xcm__addr_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    39 enum 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];
    +
    58  } addr;
    +
    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 
    +
    88 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89 
    +
    103 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104  uint16_t *port);
    +
    105 
    +
    119 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120  uint16_t *port);
    +
    121 
    +
    136 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137  uint16_t *port);
    +
    138 
    +
    153 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154  uint16_t *port);
    +
    155 
    +
    169 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170 
    +
    184 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185  size_t capacity);
    +
    186 
    +
    202 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203  char *utls_addr_s, size_t capacity);
    +
    204 
    +
    220 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221  char *tls_addr_s, size_t capacity);
    +
    222 
    +
    238 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239  char *tcp_addr_s, size_t capacity);
    +
    240 
    +
    256 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257  char *sctp_addr_s, size_t capacity);
    +
    258 
    +
    273 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274 
    +
    289 int 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..b5fdb1def --- /dev/null +++ b/api/0.15/xcm__attr_8h.html @@ -0,0 +1,614 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..9516934ae --- /dev/null +++ b/api/0.15/xcm__attr_8h_source.html @@ -0,0 +1,137 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *s, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *s, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *s, const char *name, int64_t value);
    +
    74 
    +
    87 int xcm_attr_set_str(struct xcm_socket *s, const char *name,
    +
    88  const char *value);
    +
    89 
    +
    115 int xcm_attr_get(struct xcm_socket *s, const char *name,
    +
    116  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    117 
    +
    134 int xcm_attr_get_bool(struct xcm_socket *s, const char *name,
    +
    135  bool *value);
    +
    136 
    +
    153 int xcm_attr_get_int64(struct xcm_socket *s, const char *name,
    +
    154  int64_t *value);
    +
    155 
    +
    174 int xcm_attr_get_str(struct xcm_socket *s, const char *name,
    +
    175  char *value, size_t capacity);
    +
    176 
    +
    178 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    179  void *value, size_t value_len, void *cb_data);
    +
    180 
    +
    194 void 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..76c417980 --- /dev/null +++ b/api/0.15/xcm__attr__map_8h.html @@ -0,0 +1,766 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..96510c0d2 --- /dev/null +++ b/api/0.15/xcm__attr__map_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name,
    +
    81  bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name,
    +
    95  int64_t attr_value);
    +
    96 
    +
    97 
    +
    107 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108  const char *attr_name,
    +
    109  const char *attr_value);
    +
    110 
    +
    111 
    +
    128 const 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 
    +
    148 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149  const char *attr_name);
    +
    150 
    +
    151 
    +
    166 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167  const char *attr_name);
    +
    168 
    +
    169 
    +
    184 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185  const char *attr_name);
    +
    186 
    +
    195 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196  const char *attr_name);
    +
    197 
    +
    198 
    +
    207 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208 
    +
    209 
    +
    217 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218 
    +
    219 
    +
    223 typedef 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 
    +
    242 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243  xcm_attr_map_foreach_cb cb, void *user);
    +
    244 
    +
    245 
    +
    254 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255  const struct xcm_attr_map *attr_map_b);
    +
    256 
    +
    265 void 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)
    +
    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_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 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 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..7068061ea --- /dev/null +++ b/api/0.15/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..0cc2ee6a3 --- /dev/null +++ b/api/0.15/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..d6a610f56 --- /dev/null +++ b/api/0.15/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..49092796c --- /dev/null +++ b/api/0.15/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    118 int 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..0f81b8615 --- /dev/null +++ b/api/0.15/xcm__version_8h.html @@ -0,0 +1,372 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..e4c287334 --- /dev/null +++ b/api/0.15/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    47 unsigned int xcm_version_major(void);
    +
    48 
    +
    55 unsigned int xcm_version_minor(void);
    +
    56 
    +
    62 unsigned int xcm_version_patch(void);
    +
    63 
    +
    72 const char *xcm_version(void);
    +
    73 
    +
    79 unsigned int xcm_version_api_major(void);
    +
    80 
    +
    86 unsigned int xcm_version_api_minor(void);
    +
    87 
    +
    96 const char *xcm_version_api(void);
    +
    97 
    +
    98 #ifdef __cplusplus
    +
    99 }
    +
    100 #endif
    +
    101 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..0275215c2 --- /dev/null +++ b/api/0.16/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/api/0.16/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/api/0.16/bdwn.png differ diff --git a/api/0.16/classes.html b/api/0.16/classes.html new file mode 100644 index 000000000..e34d34821 --- /dev/null +++ b/api/0.16/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..f91610c37 --- /dev/null +++ b/api/0.16/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,100 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/api/0.16/doc.png b/api/0.16/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/api/0.16/doc.png differ diff --git a/api/0.16/doxygen.css b/api/0.16/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/api/0.16/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/api/0.16/doxygen.svg b/api/0.16/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/api/0.16/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.16/dynsections.js b/api/0.16/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/api/0.16/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/api/0.16/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/api/0.16/folderclosed.png differ diff --git a/api/0.16/folderopen.png b/api/0.16/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/api/0.16/folderopen.png differ diff --git a/api/0.16/functions.html b/api/0.16/functions.html new file mode 100644 index 000000000..6a9ba371e --- /dev/null +++ b/api/0.16/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..06528496e --- /dev/null +++ b/api/0.16/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.16/globals.html b/api/0.16/globals.html new file mode 100644 index 000000000..ceeda9fae --- /dev/null +++ b/api/0.16/globals.html @@ -0,0 +1,302 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..4130b0f97 --- /dev/null +++ b/api/0.16/globals_defs.html @@ -0,0 +1,111 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.16/globals_enum.html b/api/0.16/globals_enum.html new file mode 100644 index 000000000..865683528 --- /dev/null +++ b/api/0.16/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.16/globals_eval.html b/api/0.16/globals_eval.html new file mode 100644 index 000000000..334807157 --- /dev/null +++ b/api/0.16/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.16/globals_func.html b/api/0.16/globals_func.html new file mode 100644 index 000000000..1f1798c22 --- /dev/null +++ b/api/0.16/globals_func.html @@ -0,0 +1,242 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - x -

    +
    + + + + diff --git a/api/0.16/globals_type.html b/api/0.16/globals_type.html new file mode 100644 index 000000000..1bf3a4ec4 --- /dev/null +++ b/api/0.16/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.16/group__api__version.html b/api/0.16/group__api__version.html new file mode 100644 index 000000000..f1f415f35 --- /dev/null +++ b/api/0.16/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..990209c97 --- /dev/null +++ b/api/0.16/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..a9dbd4fd0 --- /dev/null +++ b/api/0.16/index.html @@ -0,0 +1,518 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/api/0.16/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/api/0.16/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/api/0.16/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/api/0.16/modules.html new file mode 100644 index 000000000..6e4ef3786 --- /dev/null +++ b/api/0.16/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/api/0.16/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..32c9e08d3 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/api/0.16/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/api/0.16/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.16/search/all_0.js b/api/0.16/search/all_0.js new file mode 100644 index 000000000..7130f6379 --- /dev/null +++ b/api/0.16/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.16/search/all_1.html b/api/0.16/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/api/0.16/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.16/search/all_1.js b/api/0.16/search/all_1.js new file mode 100644 index 000000000..69f82ad46 --- /dev/null +++ b/api/0.16/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.16/search/all_2.html b/api/0.16/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/api/0.16/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.16/search/all_2.js b/api/0.16/search/all_2.js new file mode 100644 index 000000000..ae6e4d753 --- /dev/null +++ b/api/0.16/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.16/search/all_3.html b/api/0.16/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/api/0.16/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.16/search/all_3.js b/api/0.16/search/all_3.js new file mode 100644 index 000000000..551054f77 --- /dev/null +++ b/api/0.16/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.16/search/all_4.html b/api/0.16/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/api/0.16/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.16/search/all_4.js b/api/0.16/search/all_4.js new file mode 100644 index 000000000..fd3d5a006 --- /dev/null +++ b/api/0.16/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.16/search/all_5.html b/api/0.16/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/api/0.16/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.16/search/all_5.js b/api/0.16/search/all_5.js new file mode 100644 index 000000000..16b2d8d7e --- /dev/null +++ b/api/0.16/search/all_5.js @@ -0,0 +1,87 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_8',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_9',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_10',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_11',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_12',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_13',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_14',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_15',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_16',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_17',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_18',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_19',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_20',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_21',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_22',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_23',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_24',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_25',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_26',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_27',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_28',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',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_5fint64_30',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_31',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_32',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_33',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_38',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_46',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_47',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_48',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_49',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_50',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_51',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',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_5fattr_5ftype_54',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_55',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_56',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_57',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_58',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_59',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_60',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_61',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_62',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_63',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_64',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_65',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_66',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_67',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_68',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_69',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_70',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_71',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_72',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_73',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_74',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_75',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_76',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_77',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_78',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_79',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_80',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_81',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_82',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_83',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_84',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_85',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_86',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_87',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_88',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_89',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.16/search/all_6.html b/api/0.16/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/api/0.16/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.16/search/all_6.js b/api/0.16/search/all_6.js new file mode 100644 index 000000000..5411ca92b --- /dev/null +++ b/api/0.16/search/all_6.js @@ -0,0 +1,109 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_14',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_15',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_16',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_17',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_18',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_19',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_20',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_21',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_22',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_23',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_24',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_25',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_26',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_27',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_28',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_29',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_30',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_31',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_32',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_33',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_34',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_35',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_36',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_37',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_38',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_39',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_40',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_41',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_42',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_43',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_44',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_45',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_46',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_47',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_48',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_49',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_50',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_51',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_52',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_53',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_54',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_55',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_56',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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_5fint64_60',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_61',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_62',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_63',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_64',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',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_5fbtls_5fproto_69',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_70',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_71',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_72',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_73',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_74',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_75',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_76',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_77',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_78',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_79',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_80',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_81',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_82',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_83',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_84',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_85',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_86',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_87',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_88',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_89',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_90',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_91',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_92',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_93',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_94',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_95',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_96',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_97',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_98',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_99',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_100',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_101',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_102',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_103',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_104',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_105',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_106',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_107',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_108',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_109',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_110',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_111',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_112',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_113',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.16/search/classes_0.html b/api/0.16/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/api/0.16/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.16/search/classes_0.js b/api/0.16/search/classes_0.js new file mode 100644 index 000000000..468741d24 --- /dev/null +++ b/api/0.16/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_90',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_91',['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..a933eea1a --- /dev/null +++ b/api/0.16/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/api/0.16/search/defines_0.html b/api/0.16/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/api/0.16/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.16/search/defines_0.js b/api/0.16/search/defines_0.js new file mode 100644 index 000000000..ed9b81242 --- /dev/null +++ b/api/0.16/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_166',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_167',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_168',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_169',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_170',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_171',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_172',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_173',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_174',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_175',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_176',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_177',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_178',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.16/search/enums_0.html b/api/0.16/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/api/0.16/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.16/search/enums_0.js b/api/0.16/search/enums_0.js new file mode 100644 index 000000000..623970eaa --- /dev/null +++ b/api/0.16/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_161',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.16/search/enumvalues_0.html b/api/0.16/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/api/0.16/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.16/search/enumvalues_0.js b/api/0.16/search/enumvalues_0.js new file mode 100644 index 000000000..bf116ee08 --- /dev/null +++ b/api/0.16/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_162',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_163',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_164',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_165',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.16/search/files_0.html b/api/0.16/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/api/0.16/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.16/search/files_0.js b/api/0.16/search/files_0.js new file mode 100644 index 000000000..d46f54089 --- /dev/null +++ b/api/0.16/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_92',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_93',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_94',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_95',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_96',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_97',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/api/0.16/search/functions_0.html b/api/0.16/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/api/0.16/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.16/search/functions_0.js b/api/0.16/search/functions_0.js new file mode 100644 index 000000000..76fd95c5b --- /dev/null +++ b/api/0.16/search/functions_0.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['xcm_5faccept_98',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_99',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_100',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_101',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_102',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_103',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_104',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_105',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_106',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_107',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_108',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_109',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_110',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_111',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_112',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_113',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_114',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_115',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_116',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_117',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_118',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_119',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_120',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_121',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_122',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_123',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_124',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_125',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_126',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_127',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_128',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_129',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_130',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_131',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_132',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_133',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_134',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_135',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_136',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_137',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_138',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_139',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_140',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_141',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_142',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_143',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_144',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_145',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_146',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_147',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_148',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_149',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_150',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_151',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_152',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_153',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.16/search/groups_0.html b/api/0.16/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/api/0.16/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.16/search/groups_0.js b/api/0.16/search/groups_0.js new file mode 100644 index 000000000..6e8756088 --- /dev/null +++ b/api/0.16/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_218',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.16/search/groups_1.html b/api/0.16/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/api/0.16/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.16/search/groups_1.js b/api/0.16/search/groups_1.js new file mode 100644 index 000000000..b1f6ca015 --- /dev/null +++ b/api/0.16/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_219',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.16/search/mag_sel.svg b/api/0.16/search/mag_sel.svg new file mode 100644 index 000000000..03626f64a --- /dev/null +++ b/api/0.16/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/api/0.16/search/nomatches.html b/api/0.16/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/api/0.16/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/api/0.16/search/pages_0.html b/api/0.16/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/api/0.16/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.16/search/pages_0.js b/api/0.16/search/pages_0.js new file mode 100644 index 000000000..c122886e8 --- /dev/null +++ b/api/0.16/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_179',['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..9074198f8 --- /dev/null +++ b/api/0.16/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/api/0.16/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.16/search/typedefs_0.js b/api/0.16/search/typedefs_0.js new file mode 100644 index 000000000..c9347964e --- /dev/null +++ b/api/0.16/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_159',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_160',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/api/0.16/search/variables_0.html b/api/0.16/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/api/0.16/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.16/search/variables_0.js b/api/0.16/search/variables_0.js new file mode 100644 index 000000000..bbc532810 --- /dev/null +++ b/api/0.16/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_154',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.16/search/variables_1.html b/api/0.16/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/api/0.16/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.16/search/variables_1.js b/api/0.16/search/variables_1.js new file mode 100644 index 000000000..25a43a70b --- /dev/null +++ b/api/0.16/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_155',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.16/search/variables_2.html b/api/0.16/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/api/0.16/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.16/search/variables_2.js b/api/0.16/search/variables_2.js new file mode 100644 index 000000000..5313f9bd4 --- /dev/null +++ b/api/0.16/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_156',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_157',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.16/search/variables_3.html b/api/0.16/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/api/0.16/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.16/search/variables_3.js b/api/0.16/search/variables_3.js new file mode 100644 index 000000000..b8a64dacb --- /dev/null +++ b/api/0.16/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_158',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.16/server_accept.png b/api/0.16/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/api/0.16/server_accept.png differ diff --git a/api/0.16/splitbar.png b/api/0.16/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/api/0.16/splitbar.png differ diff --git a/api/0.16/structxcm__addr__host.html b/api/0.16/structxcm__addr__host.html new file mode 100644 index 000000000..e8d8884dc --- /dev/null +++ b/api/0.16/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..8c30c52ca --- /dev/null +++ b/api/0.16/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/api/0.16/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/api/0.16/xcm_8h.html b/api/0.16/xcm_8h.html new file mode 100644 index 000000000..3b1be4beb --- /dev/null +++ b/api/0.16/xcm_8h.html @@ -0,0 +1,905 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..3498e81cf --- /dev/null +++ b/api/0.16/xcm_8h_source.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1023 struct xcm_socket;
    +
    1024 
    +
    1075 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1076 
    +
    1098 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1099  const struct xcm_attr_map *attrs);
    +
    1100 
    +
    1131 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1132 
    +
    1148 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1149  const struct xcm_attr_map *attrs);
    +
    1150 
    +
    1167 int xcm_close(struct xcm_socket *socket);
    +
    1168 
    +
    1188 void xcm_cleanup(struct xcm_socket *socket);
    +
    1189 
    +
    1212 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1213 
    +
    1230 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1231  const struct xcm_attr_map *attrs);
    +
    1232 
    +
    1254 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1255 
    +
    1278 int 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 
    +
    1349 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1350 
    +
    1392 int xcm_fd(struct xcm_socket *socket);
    +
    1393 
    +
    1434 int xcm_finish(struct xcm_socket *socket);
    +
    1435 
    +
    1476 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1477 
    +
    1492 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1493 
    +
    1510 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1511 
    +
    1526 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..effb7ad3a --- /dev/null +++ b/api/0.16/xcm__addr_8h.html @@ -0,0 +1,940 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..551c9bfa5 --- /dev/null +++ b/api/0.16/xcm__addr_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    39 enum 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];
    +
    58  } addr;
    +
    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 
    +
    88 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89 
    +
    103 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104  uint16_t *port);
    +
    105 
    +
    119 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120  uint16_t *port);
    +
    121 
    +
    136 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137  uint16_t *port);
    +
    138 
    +
    153 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154  uint16_t *port);
    +
    155 
    +
    169 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170 
    +
    184 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185  size_t capacity);
    +
    186 
    +
    202 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203  char *utls_addr_s, size_t capacity);
    +
    204 
    +
    220 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221  char *tls_addr_s, size_t capacity);
    +
    222 
    +
    238 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239  char *tcp_addr_s, size_t capacity);
    +
    240 
    +
    256 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257  char *sctp_addr_s, size_t capacity);
    +
    258 
    +
    273 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274 
    +
    289 int 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..2f755387b --- /dev/null +++ b/api/0.16/xcm__attr_8h.html @@ -0,0 +1,614 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..3af8a654b --- /dev/null +++ b/api/0.16/xcm__attr_8h_source.html @@ -0,0 +1,139 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89  const char *value);
    +
    90 
    +
    116 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118 
    +
    135 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136  bool *value);
    +
    137 
    +
    154 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155  int64_t *value);
    +
    156 
    +
    175 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176  char *value, size_t capacity);
    +
    177 
    +
    179 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180  void *value, size_t value_len, void *cb_data);
    +
    181 
    +
    195 void 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..f0c6ace48 --- /dev/null +++ b/api/0.16/xcm__attr__map_8h.html @@ -0,0 +1,766 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..110a2e025 --- /dev/null +++ b/api/0.16/xcm__attr__map_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name,
    +
    81  bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name,
    +
    95  int64_t attr_value);
    +
    96 
    +
    97 
    +
    107 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108  const char *attr_name,
    +
    109  const char *attr_value);
    +
    110 
    +
    111 
    +
    128 const 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 
    +
    148 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149  const char *attr_name);
    +
    150 
    +
    151 
    +
    166 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167  const char *attr_name);
    +
    168 
    +
    169 
    +
    184 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185  const char *attr_name);
    +
    186 
    +
    195 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196  const char *attr_name);
    +
    197 
    +
    198 
    +
    207 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208 
    +
    209 
    +
    217 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218 
    +
    219 
    +
    223 typedef 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 
    +
    242 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243  xcm_attr_map_foreach_cb cb, void *user);
    +
    244 
    +
    245 
    +
    254 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255  const struct xcm_attr_map *attr_map_b);
    +
    256 
    +
    265 void 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)
    +
    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_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 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 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..9b52d41bd --- /dev/null +++ b/api/0.16/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..f993c2491 --- /dev/null +++ b/api/0.16/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..a927eb95d --- /dev/null +++ b/api/0.16/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..17b5b3a51 --- /dev/null +++ b/api/0.16/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..0f81b8615 --- /dev/null +++ b/api/0.16/xcm__version_8h.html @@ -0,0 +1,372 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..e4c287334 --- /dev/null +++ b/api/0.16/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    47 unsigned int xcm_version_major(void);
    +
    48 
    +
    55 unsigned int xcm_version_minor(void);
    +
    56 
    +
    62 unsigned int xcm_version_patch(void);
    +
    63 
    +
    72 const char *xcm_version(void);
    +
    73 
    +
    79 unsigned int xcm_version_api_major(void);
    +
    80 
    +
    86 unsigned int xcm_version_api_minor(void);
    +
    87 
    +
    96 const char *xcm_version_api(void);
    +
    97 
    +
    98 #ifdef __cplusplus
    +
    99 }
    +
    100 #endif
    +
    101 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..3af9dc826 --- /dev/null +++ b/api/0.17/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/api/0.17/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/api/0.17/bdwn.png differ diff --git a/api/0.17/classes.html b/api/0.17/classes.html new file mode 100644 index 000000000..a13376c53 --- /dev/null +++ b/api/0.17/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..5ceeb7e4d --- /dev/null +++ b/api/0.17/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,100 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/api/0.17/doc.png b/api/0.17/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/api/0.17/doc.png differ diff --git a/api/0.17/doxygen.css b/api/0.17/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/api/0.17/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/api/0.17/doxygen.svg b/api/0.17/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/api/0.17/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.17/dynsections.js b/api/0.17/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/api/0.17/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/api/0.17/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/api/0.17/folderclosed.png differ diff --git a/api/0.17/folderopen.png b/api/0.17/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/api/0.17/folderopen.png differ diff --git a/api/0.17/functions.html b/api/0.17/functions.html new file mode 100644 index 000000000..a1a70f5bb --- /dev/null +++ b/api/0.17/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..7490484df --- /dev/null +++ b/api/0.17/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.17/globals.html b/api/0.17/globals.html new file mode 100644 index 000000000..74aa4bd96 --- /dev/null +++ b/api/0.17/globals.html @@ -0,0 +1,302 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..9ad75c701 --- /dev/null +++ b/api/0.17/globals_defs.html @@ -0,0 +1,111 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.17/globals_enum.html b/api/0.17/globals_enum.html new file mode 100644 index 000000000..6092b8d69 --- /dev/null +++ b/api/0.17/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.17/globals_eval.html b/api/0.17/globals_eval.html new file mode 100644 index 000000000..37d13cfea --- /dev/null +++ b/api/0.17/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.17/globals_func.html b/api/0.17/globals_func.html new file mode 100644 index 000000000..da9d6b11a --- /dev/null +++ b/api/0.17/globals_func.html @@ -0,0 +1,242 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - x -

    +
    + + + + diff --git a/api/0.17/globals_type.html b/api/0.17/globals_type.html new file mode 100644 index 000000000..9d5c94c90 --- /dev/null +++ b/api/0.17/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.17/group__api__version.html b/api/0.17/group__api__version.html new file mode 100644 index 000000000..f1f415f35 --- /dev/null +++ b/api/0.17/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..990209c97 --- /dev/null +++ b/api/0.17/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..e66cc77d8 --- /dev/null +++ b/api/0.17/index.html @@ -0,0 +1,553 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/api/0.17/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/api/0.17/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/api/0.17/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/api/0.17/modules.html new file mode 100644 index 000000000..6e4ef3786 --- /dev/null +++ b/api/0.17/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/api/0.17/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..32c9e08d3 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/api/0.17/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/api/0.17/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.17/search/all_0.js b/api/0.17/search/all_0.js new file mode 100644 index 000000000..7130f6379 --- /dev/null +++ b/api/0.17/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.17/search/all_1.html b/api/0.17/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/api/0.17/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.17/search/all_1.js b/api/0.17/search/all_1.js new file mode 100644 index 000000000..69f82ad46 --- /dev/null +++ b/api/0.17/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.17/search/all_2.html b/api/0.17/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/api/0.17/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.17/search/all_2.js b/api/0.17/search/all_2.js new file mode 100644 index 000000000..ae6e4d753 --- /dev/null +++ b/api/0.17/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.17/search/all_3.html b/api/0.17/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/api/0.17/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.17/search/all_3.js b/api/0.17/search/all_3.js new file mode 100644 index 000000000..551054f77 --- /dev/null +++ b/api/0.17/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.17/search/all_4.html b/api/0.17/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/api/0.17/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.17/search/all_4.js b/api/0.17/search/all_4.js new file mode 100644 index 000000000..fd3d5a006 --- /dev/null +++ b/api/0.17/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.17/search/all_5.html b/api/0.17/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/api/0.17/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.17/search/all_5.js b/api/0.17/search/all_5.js new file mode 100644 index 000000000..16b2d8d7e --- /dev/null +++ b/api/0.17/search/all_5.js @@ -0,0 +1,87 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_8',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_9',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_10',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_11',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_12',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_13',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_14',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_15',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_16',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_17',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_18',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_19',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_20',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_21',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_22',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_23',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_24',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_25',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_26',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_27',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_28',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',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_5fint64_30',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_31',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_32',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_33',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_38',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_46',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_47',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_48',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_49',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_50',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_51',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',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_5fattr_5ftype_54',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_55',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_56',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_57',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_58',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_59',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_60',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_61',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_62',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_63',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_64',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_65',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_66',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_67',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_68',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_69',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_70',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_71',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_72',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_73',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_74',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_75',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_76',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_77',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_78',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_79',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_80',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_81',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_82',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_83',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_84',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_85',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_86',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_87',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_88',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_89',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.17/search/all_6.html b/api/0.17/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/api/0.17/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.17/search/all_6.js b/api/0.17/search/all_6.js new file mode 100644 index 000000000..5411ca92b --- /dev/null +++ b/api/0.17/search/all_6.js @@ -0,0 +1,109 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_14',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_15',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_16',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_17',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_18',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_19',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_20',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_21',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_22',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_23',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_24',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_25',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_26',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_27',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_28',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_29',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_30',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_31',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_32',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_33',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_34',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_35',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_36',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_37',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_38',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_39',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_40',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_41',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_42',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_43',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_44',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_45',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_46',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_47',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_48',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_49',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_50',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_51',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_52',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_53',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_54',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_55',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_56',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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_5fint64_60',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_61',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_62',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_63',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_64',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',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_5fbtls_5fproto_69',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_70',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_71',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_72',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_73',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_74',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_75',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_76',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_77',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_78',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_79',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_80',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_81',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_82',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_83',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_84',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_85',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_86',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_87',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_88',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_89',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_90',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_91',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_92',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_93',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_94',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_95',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_96',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_97',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_98',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_99',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_100',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_101',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_102',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_103',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_104',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_105',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_106',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_107',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_108',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_109',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_110',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_111',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_112',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_113',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.17/search/classes_0.html b/api/0.17/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/api/0.17/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.17/search/classes_0.js b/api/0.17/search/classes_0.js new file mode 100644 index 000000000..468741d24 --- /dev/null +++ b/api/0.17/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_90',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_91',['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..a933eea1a --- /dev/null +++ b/api/0.17/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/api/0.17/search/defines_0.html b/api/0.17/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/api/0.17/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.17/search/defines_0.js b/api/0.17/search/defines_0.js new file mode 100644 index 000000000..ed9b81242 --- /dev/null +++ b/api/0.17/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_166',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_167',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_168',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_169',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_170',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_171',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_172',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_173',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_174',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_175',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_176',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_177',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_178',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.17/search/enums_0.html b/api/0.17/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/api/0.17/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.17/search/enums_0.js b/api/0.17/search/enums_0.js new file mode 100644 index 000000000..623970eaa --- /dev/null +++ b/api/0.17/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_161',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.17/search/enumvalues_0.html b/api/0.17/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/api/0.17/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.17/search/enumvalues_0.js b/api/0.17/search/enumvalues_0.js new file mode 100644 index 000000000..bf116ee08 --- /dev/null +++ b/api/0.17/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_162',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_163',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_164',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_165',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.17/search/files_0.html b/api/0.17/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/api/0.17/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.17/search/files_0.js b/api/0.17/search/files_0.js new file mode 100644 index 000000000..d46f54089 --- /dev/null +++ b/api/0.17/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_92',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_93',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_94',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_95',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_96',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_97',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/api/0.17/search/functions_0.html b/api/0.17/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/api/0.17/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.17/search/functions_0.js b/api/0.17/search/functions_0.js new file mode 100644 index 000000000..76fd95c5b --- /dev/null +++ b/api/0.17/search/functions_0.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['xcm_5faccept_98',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_99',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_100',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_101',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_102',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_103',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_104',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_105',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_106',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_107',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_108',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_109',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_110',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_111',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_112',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_113',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_114',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_115',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_116',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_117',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_118',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_119',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_120',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_121',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_122',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_123',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_124',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_125',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_126',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_127',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_128',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_129',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_130',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_131',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_132',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_133',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_134',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_135',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_136',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_137',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_138',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_139',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_140',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_141',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_142',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_143',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_144',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_145',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_146',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_147',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_148',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_149',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_150',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_151',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_152',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_153',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.17/search/groups_0.html b/api/0.17/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/api/0.17/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.17/search/groups_0.js b/api/0.17/search/groups_0.js new file mode 100644 index 000000000..6e8756088 --- /dev/null +++ b/api/0.17/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_218',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.17/search/groups_1.html b/api/0.17/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/api/0.17/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.17/search/groups_1.js b/api/0.17/search/groups_1.js new file mode 100644 index 000000000..b1f6ca015 --- /dev/null +++ b/api/0.17/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_219',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.17/search/mag_sel.svg b/api/0.17/search/mag_sel.svg new file mode 100644 index 000000000..03626f64a --- /dev/null +++ b/api/0.17/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/api/0.17/search/nomatches.html b/api/0.17/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/api/0.17/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/api/0.17/search/pages_0.html b/api/0.17/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/api/0.17/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.17/search/pages_0.js b/api/0.17/search/pages_0.js new file mode 100644 index 000000000..c122886e8 --- /dev/null +++ b/api/0.17/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_179',['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..9074198f8 --- /dev/null +++ b/api/0.17/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/api/0.17/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.17/search/typedefs_0.js b/api/0.17/search/typedefs_0.js new file mode 100644 index 000000000..c9347964e --- /dev/null +++ b/api/0.17/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_159',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_160',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/api/0.17/search/variables_0.html b/api/0.17/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/api/0.17/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.17/search/variables_0.js b/api/0.17/search/variables_0.js new file mode 100644 index 000000000..bbc532810 --- /dev/null +++ b/api/0.17/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_154',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.17/search/variables_1.html b/api/0.17/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/api/0.17/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.17/search/variables_1.js b/api/0.17/search/variables_1.js new file mode 100644 index 000000000..25a43a70b --- /dev/null +++ b/api/0.17/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_155',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.17/search/variables_2.html b/api/0.17/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/api/0.17/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.17/search/variables_2.js b/api/0.17/search/variables_2.js new file mode 100644 index 000000000..5313f9bd4 --- /dev/null +++ b/api/0.17/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_156',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_157',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.17/search/variables_3.html b/api/0.17/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/api/0.17/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.17/search/variables_3.js b/api/0.17/search/variables_3.js new file mode 100644 index 000000000..b8a64dacb --- /dev/null +++ b/api/0.17/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_158',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.17/server_accept.png b/api/0.17/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/api/0.17/server_accept.png differ diff --git a/api/0.17/splitbar.png b/api/0.17/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/api/0.17/splitbar.png differ diff --git a/api/0.17/structxcm__addr__host.html b/api/0.17/structxcm__addr__host.html new file mode 100644 index 000000000..d6fb74f50 --- /dev/null +++ b/api/0.17/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..54536d323 --- /dev/null +++ b/api/0.17/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/api/0.17/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/api/0.17/xcm_8h.html b/api/0.17/xcm_8h.html new file mode 100644 index 000000000..3b4b5feae --- /dev/null +++ b/api/0.17/xcm_8h.html @@ -0,0 +1,905 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..b83989e5a --- /dev/null +++ b/api/0.17/xcm_8h_source.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1114 struct xcm_socket;
    +
    1115 
    +
    1166 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1167 
    +
    1189 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1190  const struct xcm_attr_map *attrs);
    +
    1191 
    +
    1222 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1223 
    +
    1239 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1240  const struct xcm_attr_map *attrs);
    +
    1241 
    +
    1258 int xcm_close(struct xcm_socket *socket);
    +
    1259 
    +
    1279 void xcm_cleanup(struct xcm_socket *socket);
    +
    1280 
    +
    1303 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1304 
    +
    1321 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1322  const struct xcm_attr_map *attrs);
    +
    1323 
    +
    1345 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1346 
    +
    1369 int 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 
    +
    1440 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1441 
    +
    1483 int xcm_fd(struct xcm_socket *socket);
    +
    1484 
    +
    1525 int xcm_finish(struct xcm_socket *socket);
    +
    1526 
    +
    1567 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1568 
    +
    1583 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1584 
    +
    1601 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1602 
    +
    1617 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..5267dde28 --- /dev/null +++ b/api/0.17/xcm__addr_8h.html @@ -0,0 +1,940 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..5860ccffd --- /dev/null +++ b/api/0.17/xcm__addr_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    39 enum 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];
    +
    58  } addr;
    +
    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 
    +
    88 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89 
    +
    103 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104  uint16_t *port);
    +
    105 
    +
    119 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120  uint16_t *port);
    +
    121 
    +
    136 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137  uint16_t *port);
    +
    138 
    +
    153 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154  uint16_t *port);
    +
    155 
    +
    169 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170 
    +
    184 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185  size_t capacity);
    +
    186 
    +
    202 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203  char *utls_addr_s, size_t capacity);
    +
    204 
    +
    220 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221  char *tls_addr_s, size_t capacity);
    +
    222 
    +
    238 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239  char *tcp_addr_s, size_t capacity);
    +
    240 
    +
    256 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257  char *sctp_addr_s, size_t capacity);
    +
    258 
    +
    273 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274 
    +
    289 int 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..d21d5dd60 --- /dev/null +++ b/api/0.17/xcm__attr_8h.html @@ -0,0 +1,614 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..b9cd790b7 --- /dev/null +++ b/api/0.17/xcm__attr_8h_source.html @@ -0,0 +1,139 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89  const char *value);
    +
    90 
    +
    116 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118 
    +
    135 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136  bool *value);
    +
    137 
    +
    154 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155  int64_t *value);
    +
    156 
    +
    175 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176  char *value, size_t capacity);
    +
    177 
    +
    179 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180  void *value, size_t value_len, void *cb_data);
    +
    181 
    +
    195 void 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..dfea0e58f --- /dev/null +++ b/api/0.17/xcm__attr__map_8h.html @@ -0,0 +1,766 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..a8047525d --- /dev/null +++ b/api/0.17/xcm__attr__map_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name,
    +
    81  bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name,
    +
    95  int64_t attr_value);
    +
    96 
    +
    97 
    +
    107 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108  const char *attr_name,
    +
    109  const char *attr_value);
    +
    110 
    +
    111 
    +
    128 const 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 
    +
    148 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149  const char *attr_name);
    +
    150 
    +
    151 
    +
    166 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167  const char *attr_name);
    +
    168 
    +
    169 
    +
    184 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185  const char *attr_name);
    +
    186 
    +
    195 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196  const char *attr_name);
    +
    197 
    +
    198 
    +
    207 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208 
    +
    209 
    +
    217 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218 
    +
    219 
    +
    223 typedef 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 
    +
    242 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243  xcm_attr_map_foreach_cb cb, void *user);
    +
    244 
    +
    245 
    +
    254 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255  const struct xcm_attr_map *attr_map_b);
    +
    256 
    +
    265 void 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)
    +
    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_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 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 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..58ca65e1d --- /dev/null +++ b/api/0.17/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..9917e63a9 --- /dev/null +++ b/api/0.17/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..6c5a21162 --- /dev/null +++ b/api/0.17/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..856970594 --- /dev/null +++ b/api/0.17/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..0f81b8615 --- /dev/null +++ b/api/0.17/xcm__version_8h.html @@ -0,0 +1,372 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..e4c287334 --- /dev/null +++ b/api/0.17/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    47 unsigned int xcm_version_major(void);
    +
    48 
    +
    55 unsigned int xcm_version_minor(void);
    +
    56 
    +
    62 unsigned int xcm_version_patch(void);
    +
    63 
    +
    72 const char *xcm_version(void);
    +
    73 
    +
    79 unsigned int xcm_version_api_major(void);
    +
    80 
    +
    86 unsigned int xcm_version_api_minor(void);
    +
    87 
    +
    96 const char *xcm_version_api(void);
    +
    97 
    +
    98 #ifdef __cplusplus
    +
    99 }
    +
    100 #endif
    +
    101 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..892a97dec --- /dev/null +++ b/api/0.18/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/api/0.18/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/api/0.18/bdwn.png differ diff --git a/api/0.18/classes.html b/api/0.18/classes.html new file mode 100644 index 000000000..8bd661230 --- /dev/null +++ b/api/0.18/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..b14183250 --- /dev/null +++ b/api/0.18/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,100 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/api/0.18/doc.png b/api/0.18/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/api/0.18/doc.png differ diff --git a/api/0.18/doxygen.css b/api/0.18/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/api/0.18/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/api/0.18/doxygen.svg b/api/0.18/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/api/0.18/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.18/dynsections.js b/api/0.18/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/api/0.18/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/api/0.18/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/api/0.18/folderclosed.png differ diff --git a/api/0.18/folderopen.png b/api/0.18/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/api/0.18/folderopen.png differ diff --git a/api/0.18/functions.html b/api/0.18/functions.html new file mode 100644 index 000000000..182d78b10 --- /dev/null +++ b/api/0.18/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..49c2e6cb9 --- /dev/null +++ b/api/0.18/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.18/globals.html b/api/0.18/globals.html new file mode 100644 index 000000000..d64e462a3 --- /dev/null +++ b/api/0.18/globals.html @@ -0,0 +1,311 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..498b32abc --- /dev/null +++ b/api/0.18/globals_defs.html @@ -0,0 +1,114 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.18/globals_enum.html b/api/0.18/globals_enum.html new file mode 100644 index 000000000..ccdb15304 --- /dev/null +++ b/api/0.18/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.18/globals_eval.html b/api/0.18/globals_eval.html new file mode 100644 index 000000000..8b701e3f2 --- /dev/null +++ b/api/0.18/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.18/globals_func.html b/api/0.18/globals_func.html new file mode 100644 index 000000000..ea3ea17bf --- /dev/null +++ b/api/0.18/globals_func.html @@ -0,0 +1,248 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - x -

    +
    + + + + diff --git a/api/0.18/globals_type.html b/api/0.18/globals_type.html new file mode 100644 index 000000000..595be862d --- /dev/null +++ b/api/0.18/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.18/group__api__version.html b/api/0.18/group__api__version.html new file mode 100644 index 000000000..f1f415f35 --- /dev/null +++ b/api/0.18/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..990209c97 --- /dev/null +++ b/api/0.18/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..8929f3542 --- /dev/null +++ b/api/0.18/index.html @@ -0,0 +1,607 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/api/0.18/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/api/0.18/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/api/0.18/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/api/0.18/modules.html new file mode 100644 index 000000000..6e4ef3786 --- /dev/null +++ b/api/0.18/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/api/0.18/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..e1c7e12e8 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/api/0.18/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/api/0.18/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.18/search/all_0.js b/api/0.18/search/all_0.js new file mode 100644 index 000000000..7130f6379 --- /dev/null +++ b/api/0.18/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.18/search/all_1.html b/api/0.18/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/api/0.18/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.18/search/all_1.js b/api/0.18/search/all_1.js new file mode 100644 index 000000000..69f82ad46 --- /dev/null +++ b/api/0.18/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.18/search/all_2.html b/api/0.18/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/api/0.18/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.18/search/all_2.js b/api/0.18/search/all_2.js new file mode 100644 index 000000000..ae6e4d753 --- /dev/null +++ b/api/0.18/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.18/search/all_3.html b/api/0.18/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/api/0.18/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.18/search/all_3.js b/api/0.18/search/all_3.js new file mode 100644 index 000000000..551054f77 --- /dev/null +++ b/api/0.18/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.18/search/all_4.html b/api/0.18/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/api/0.18/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.18/search/all_4.js b/api/0.18/search/all_4.js new file mode 100644 index 000000000..fd3d5a006 --- /dev/null +++ b/api/0.18/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.18/search/all_5.html b/api/0.18/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/api/0.18/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.18/search/all_5.js b/api/0.18/search/all_5.js new file mode 100644 index 000000000..4b87832de --- /dev/null +++ b/api/0.18/search/all_5.js @@ -0,0 +1,90 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_8',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_9',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_10',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_11',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_12',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_13',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_14',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_15',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_16',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_17',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_18',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_19',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_20',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_21',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_22',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_23',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_24',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_25',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_26',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_27',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_28',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_29',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_30',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',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_5fint64_32',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_33',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_34',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_35',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_36',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_40',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_48',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_49',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_50',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_51',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_52',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_53',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_54',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_55',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_56',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_57',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_58',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_59',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_60',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_61',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_62',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_63',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_64',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_65',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_66',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_67',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_68',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_69',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_70',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_71',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_72',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_73',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_74',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_75',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_76',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_77',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_78',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_79',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_80',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_81',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_82',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_83',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_84',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_85',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_86',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_87',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_88',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_89',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_90',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_91',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_92',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.18/search/all_6.html b/api/0.18/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/api/0.18/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.18/search/all_6.js b/api/0.18/search/all_6.js new file mode 100644 index 000000000..5411ca92b --- /dev/null +++ b/api/0.18/search/all_6.js @@ -0,0 +1,109 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_14',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_15',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_16',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_17',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_18',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_19',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_20',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_21',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_22',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_23',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_24',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_25',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_26',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_27',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_28',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_29',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_30',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_31',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_32',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_33',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_34',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_35',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_36',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_37',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_38',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_39',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_40',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_41',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_42',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_43',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_44',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_45',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_46',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_47',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_48',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_49',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_50',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_51',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_52',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_53',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_54',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_55',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_56',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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_5fint64_60',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_61',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_62',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_63',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_64',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',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_5fbtls_5fproto_69',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_70',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_71',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_72',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_73',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_74',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_75',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_76',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_77',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_78',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_79',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_80',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_81',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_82',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_83',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_84',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_85',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_86',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_87',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_88',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_89',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_90',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_91',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_92',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_93',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_94',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_95',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_96',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_97',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_98',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_99',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_100',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_101',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_102',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_103',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_104',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_105',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_106',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_107',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_108',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_109',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_110',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_111',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_112',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_113',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.18/search/classes_0.html b/api/0.18/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/api/0.18/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.18/search/classes_0.js b/api/0.18/search/classes_0.js new file mode 100644 index 000000000..d69a5ebf5 --- /dev/null +++ b/api/0.18/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_93',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_94',['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..a933eea1a --- /dev/null +++ b/api/0.18/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/api/0.18/search/defines_0.html b/api/0.18/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/api/0.18/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.18/search/defines_0.js b/api/0.18/search/defines_0.js new file mode 100644 index 000000000..3816dfd51 --- /dev/null +++ b/api/0.18/search/defines_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_171',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_172',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_173',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_174',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_175',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_176',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_177',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_178',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_179',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_180',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_181',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_182',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_183',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_184',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.18/search/enums_0.html b/api/0.18/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/api/0.18/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.18/search/enums_0.js b/api/0.18/search/enums_0.js new file mode 100644 index 000000000..54f7540ad --- /dev/null +++ b/api/0.18/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_166',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.18/search/enumvalues_0.html b/api/0.18/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/api/0.18/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.18/search/enumvalues_0.js b/api/0.18/search/enumvalues_0.js new file mode 100644 index 000000000..7986e5f66 --- /dev/null +++ b/api/0.18/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_167',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_168',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_169',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_170',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.18/search/files_0.html b/api/0.18/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/api/0.18/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.18/search/files_0.js b/api/0.18/search/files_0.js new file mode 100644 index 000000000..197501694 --- /dev/null +++ b/api/0.18/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_95',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_96',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_97',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_98',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_99',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_100',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/api/0.18/search/functions_0.html b/api/0.18/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/api/0.18/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.18/search/functions_0.js b/api/0.18/search/functions_0.js new file mode 100644 index 000000000..2eb38b578 --- /dev/null +++ b/api/0.18/search/functions_0.js @@ -0,0 +1,61 @@ +var searchData= +[ + ['xcm_5faccept_101',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_102',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_103',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_104',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_105',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_106',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_107',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_108',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_109',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_110',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_111',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_112',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_113',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_114',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_115',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_116',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_117',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_118',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_119',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_120',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_121',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_122',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_123',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_124',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_125',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_126',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_127',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_128',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_129',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_130',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_131',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_132',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_133',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_134',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_135',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_136',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_137',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_138',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_139',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_140',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_141',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_142',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_143',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_144',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_145',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_146',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_147',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_148',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_149',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_150',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_151',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_152',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_153',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_154',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_155',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_156',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_157',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_158',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.18/search/groups_0.html b/api/0.18/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/api/0.18/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.18/search/groups_0.js b/api/0.18/search/groups_0.js new file mode 100644 index 000000000..6e8756088 --- /dev/null +++ b/api/0.18/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_218',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.18/search/groups_1.html b/api/0.18/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/api/0.18/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.18/search/groups_1.js b/api/0.18/search/groups_1.js new file mode 100644 index 000000000..b1f6ca015 --- /dev/null +++ b/api/0.18/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_219',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.18/search/mag_sel.svg b/api/0.18/search/mag_sel.svg new file mode 100644 index 000000000..03626f64a --- /dev/null +++ b/api/0.18/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/api/0.18/search/nomatches.html b/api/0.18/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/api/0.18/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/api/0.18/search/pages_0.html b/api/0.18/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/api/0.18/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.18/search/pages_0.js b/api/0.18/search/pages_0.js new file mode 100644 index 000000000..60011d008 --- /dev/null +++ b/api/0.18/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_185',['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..9074198f8 --- /dev/null +++ b/api/0.18/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/api/0.18/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.18/search/typedefs_0.js b/api/0.18/search/typedefs_0.js new file mode 100644 index 000000000..3015b744f --- /dev/null +++ b/api/0.18/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_164',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_165',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/api/0.18/search/variables_0.html b/api/0.18/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/api/0.18/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.18/search/variables_0.js b/api/0.18/search/variables_0.js new file mode 100644 index 000000000..bff86f5e1 --- /dev/null +++ b/api/0.18/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_159',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.18/search/variables_1.html b/api/0.18/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/api/0.18/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.18/search/variables_1.js b/api/0.18/search/variables_1.js new file mode 100644 index 000000000..3de59b8ca --- /dev/null +++ b/api/0.18/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_160',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.18/search/variables_2.html b/api/0.18/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/api/0.18/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.18/search/variables_2.js b/api/0.18/search/variables_2.js new file mode 100644 index 000000000..8883ac845 --- /dev/null +++ b/api/0.18/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_161',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_162',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.18/search/variables_3.html b/api/0.18/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/api/0.18/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.18/search/variables_3.js b/api/0.18/search/variables_3.js new file mode 100644 index 000000000..25978f346 --- /dev/null +++ b/api/0.18/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_163',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.18/server_accept.png b/api/0.18/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/api/0.18/server_accept.png differ diff --git a/api/0.18/splitbar.png b/api/0.18/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/api/0.18/splitbar.png differ diff --git a/api/0.18/structxcm__addr__host.html b/api/0.18/structxcm__addr__host.html new file mode 100644 index 000000000..5c523ed88 --- /dev/null +++ b/api/0.18/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..dd880560d --- /dev/null +++ b/api/0.18/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/api/0.18/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/api/0.18/xcm_8h.html b/api/0.18/xcm_8h.html new file mode 100644 index 000000000..6dbbef704 --- /dev/null +++ b/api/0.18/xcm_8h.html @@ -0,0 +1,907 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..c9fe8fe6b --- /dev/null +++ b/api/0.18/xcm_8h_source.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1238 struct xcm_socket;
    +
    1239 
    +
    1294 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1295 
    +
    1317 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1318  const struct xcm_attr_map *attrs);
    +
    1319 
    +
    1354 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1355 
    +
    1371 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1372  const struct xcm_attr_map *attrs);
    +
    1373 
    +
    1390 int xcm_close(struct xcm_socket *socket);
    +
    1391 
    +
    1411 void xcm_cleanup(struct xcm_socket *socket);
    +
    1412 
    +
    1435 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1436 
    +
    1453 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1454  const struct xcm_attr_map *attrs);
    +
    1455 
    +
    1478 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1479 
    +
    1503 int 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 
    +
    1574 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1575 
    +
    1617 int xcm_fd(struct xcm_socket *socket);
    +
    1618 
    +
    1659 int xcm_finish(struct xcm_socket *socket);
    +
    1660 
    +
    1701 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1702 
    +
    1717 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1718 
    +
    1735 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1736 
    +
    1751 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..b86ff28dc --- /dev/null +++ b/api/0.18/xcm__addr_8h.html @@ -0,0 +1,1070 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..33161669f --- /dev/null +++ b/api/0.18/xcm__addr_8h_source.html @@ -0,0 +1,199 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    44 enum 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];
    +
    63  } addr;
    +
    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 
    +
    93 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94 
    +
    108 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109  uint16_t *port);
    +
    110 
    +
    124 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125  uint16_t *port);
    +
    126 
    +
    141 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142  uint16_t *port);
    +
    143 
    +
    158 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159  uint16_t *port);
    +
    160 
    +
    174 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175 
    +
    189 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190  size_t capacity);
    +
    191 
    +
    205 int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206  uint16_t *port);
    +
    207 
    +
    223 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224  char *utls_addr_s, size_t capacity);
    +
    225 
    +
    241 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242  char *tls_addr_s, size_t capacity);
    +
    243 
    +
    259 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260  char *tcp_addr_s, size_t capacity);
    +
    261 
    +
    277 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278  char *sctp_addr_s, size_t capacity);
    +
    279 
    +
    294 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295 
    +
    310 int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311 
    +
    327 int 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..c9a0160ce --- /dev/null +++ b/api/0.18/xcm__attr_8h.html @@ -0,0 +1,614 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..b9da9adb5 --- /dev/null +++ b/api/0.18/xcm__attr_8h_source.html @@ -0,0 +1,139 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89  const char *value);
    +
    90 
    +
    116 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118 
    +
    135 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136  bool *value);
    +
    137 
    +
    154 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155  int64_t *value);
    +
    156 
    +
    175 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176  char *value, size_t capacity);
    +
    177 
    +
    179 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180  void *value, size_t value_len, void *cb_data);
    +
    181 
    +
    195 void 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..4e4c0a9cb --- /dev/null +++ b/api/0.18/xcm__attr__map_8h.html @@ -0,0 +1,766 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..4fa7d7b1c --- /dev/null +++ b/api/0.18/xcm__attr__map_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name,
    +
    81  bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name,
    +
    95  int64_t attr_value);
    +
    96 
    +
    97 
    +
    107 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108  const char *attr_name,
    +
    109  const char *attr_value);
    +
    110 
    +
    111 
    +
    128 const 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 
    +
    148 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149  const char *attr_name);
    +
    150 
    +
    151 
    +
    166 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167  const char *attr_name);
    +
    168 
    +
    169 
    +
    184 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185  const char *attr_name);
    +
    186 
    +
    195 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196  const char *attr_name);
    +
    197 
    +
    198 
    +
    207 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208 
    +
    209 
    +
    217 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218 
    +
    219 
    +
    223 typedef 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 
    +
    242 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243  xcm_attr_map_foreach_cb cb, void *user);
    +
    244 
    +
    245 
    +
    254 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255  const struct xcm_attr_map *attr_map_b);
    +
    256 
    +
    265 void 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)
    +
    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_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 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 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..b021e60f1 --- /dev/null +++ b/api/0.18/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..e2897e24d --- /dev/null +++ b/api/0.18/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..26a01f233 --- /dev/null +++ b/api/0.18/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..c80e92afd --- /dev/null +++ b/api/0.18/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..0f81b8615 --- /dev/null +++ b/api/0.18/xcm__version_8h.html @@ -0,0 +1,372 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..e4c287334 --- /dev/null +++ b/api/0.18/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    47 unsigned int xcm_version_major(void);
    +
    48 
    +
    55 unsigned int xcm_version_minor(void);
    +
    56 
    +
    62 unsigned int xcm_version_patch(void);
    +
    63 
    +
    72 const char *xcm_version(void);
    +
    73 
    +
    79 unsigned int xcm_version_api_major(void);
    +
    80 
    +
    86 unsigned int xcm_version_api_minor(void);
    +
    87 
    +
    96 const char *xcm_version_api(void);
    +
    97 
    +
    98 #ifdef __cplusplus
    +
    99 }
    +
    100 #endif
    +
    101 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..a657c4b09 --- /dev/null +++ b/api/0.19/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/api/0.19/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/api/0.19/bdwn.png differ diff --git a/api/0.19/classes.html b/api/0.19/classes.html new file mode 100644 index 000000000..46a15ecd1 --- /dev/null +++ b/api/0.19/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..bc019dd0e --- /dev/null +++ b/api/0.19/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,100 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/api/0.19/doc.png b/api/0.19/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/api/0.19/doc.png differ diff --git a/api/0.19/doxygen.css b/api/0.19/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/api/0.19/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/api/0.19/doxygen.svg b/api/0.19/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/api/0.19/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.19/dynsections.js b/api/0.19/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/api/0.19/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/api/0.19/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/api/0.19/folderclosed.png differ diff --git a/api/0.19/folderopen.png b/api/0.19/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/api/0.19/folderopen.png differ diff --git a/api/0.19/functions.html b/api/0.19/functions.html new file mode 100644 index 000000000..5a445aa98 --- /dev/null +++ b/api/0.19/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..502710c45 --- /dev/null +++ b/api/0.19/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.19/globals.html b/api/0.19/globals.html new file mode 100644 index 000000000..17ae32283 --- /dev/null +++ b/api/0.19/globals.html @@ -0,0 +1,314 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..f6bf48c0c --- /dev/null +++ b/api/0.19/globals_defs.html @@ -0,0 +1,114 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.19/globals_enum.html b/api/0.19/globals_enum.html new file mode 100644 index 000000000..dc9ac4b79 --- /dev/null +++ b/api/0.19/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.19/globals_eval.html b/api/0.19/globals_eval.html new file mode 100644 index 000000000..adf5ceb88 --- /dev/null +++ b/api/0.19/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.19/globals_func.html b/api/0.19/globals_func.html new file mode 100644 index 000000000..8a15ef301 --- /dev/null +++ b/api/0.19/globals_func.html @@ -0,0 +1,251 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - x -

    +
    + + + + diff --git a/api/0.19/globals_type.html b/api/0.19/globals_type.html new file mode 100644 index 000000000..ba241f77e --- /dev/null +++ b/api/0.19/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.19/group__api__version.html b/api/0.19/group__api__version.html new file mode 100644 index 000000000..f1f415f35 --- /dev/null +++ b/api/0.19/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..990209c97 --- /dev/null +++ b/api/0.19/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..d27e84375 --- /dev/null +++ b/api/0.19/index.html @@ -0,0 +1,615 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/api/0.19/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/api/0.19/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/api/0.19/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/api/0.19/modules.html new file mode 100644 index 000000000..6e4ef3786 --- /dev/null +++ b/api/0.19/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/api/0.19/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..e1c7e12e8 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/api/0.19/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/api/0.19/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.19/search/all_0.js b/api/0.19/search/all_0.js new file mode 100644 index 000000000..7130f6379 --- /dev/null +++ b/api/0.19/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.19/search/all_1.html b/api/0.19/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/api/0.19/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.19/search/all_1.js b/api/0.19/search/all_1.js new file mode 100644 index 000000000..69f82ad46 --- /dev/null +++ b/api/0.19/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.19/search/all_2.html b/api/0.19/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/api/0.19/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.19/search/all_2.js b/api/0.19/search/all_2.js new file mode 100644 index 000000000..ae6e4d753 --- /dev/null +++ b/api/0.19/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.19/search/all_3.html b/api/0.19/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/api/0.19/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.19/search/all_3.js b/api/0.19/search/all_3.js new file mode 100644 index 000000000..551054f77 --- /dev/null +++ b/api/0.19/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.19/search/all_4.html b/api/0.19/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/api/0.19/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.19/search/all_4.js b/api/0.19/search/all_4.js new file mode 100644 index 000000000..fd3d5a006 --- /dev/null +++ b/api/0.19/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.19/search/all_5.html b/api/0.19/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/api/0.19/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.19/search/all_5.js b/api/0.19/search/all_5.js new file mode 100644 index 000000000..2976ec53a --- /dev/null +++ b/api/0.19/search/all_5.js @@ -0,0 +1,91 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_8',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_9',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_10',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_11',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_12',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_13',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_14',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_15',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_16',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_17',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_18',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_19',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_20',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_21',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_22',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_23',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_24',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_25',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_26',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_27',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_28',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_29',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_30',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',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_5fint64_32',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_33',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_34',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['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_5fbool_37',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_38',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_39',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_40',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_41',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_42',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_43',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_44',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_45',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_46',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_47',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_48',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_49',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_50',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_51',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_52',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_53',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_54',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_55',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_56',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_57',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_58',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_59',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_60',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_61',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_62',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_63',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_64',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_65',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_66',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_67',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_68',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_69',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_70',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_71',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_72',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_73',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_74',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_75',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_76',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_77',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_78',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_79',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_80',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_81',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_82',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_83',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_84',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_85',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_86',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_87',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_88',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_89',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_90',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_91',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_92',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_93',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.19/search/all_6.html b/api/0.19/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/api/0.19/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.19/search/all_6.js b/api/0.19/search/all_6.js new file mode 100644 index 000000000..5411ca92b --- /dev/null +++ b/api/0.19/search/all_6.js @@ -0,0 +1,109 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_14',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_15',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_16',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_17',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_18',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_19',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_20',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_21',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_22',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_23',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_24',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_25',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_26',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_27',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_28',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_29',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_30',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_31',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_32',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_33',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_34',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_35',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_36',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_37',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_38',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_39',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_40',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_41',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_42',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_43',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_44',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_45',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_46',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_47',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_48',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_49',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_50',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_51',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_52',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_53',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_54',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_55',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_56',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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_5fint64_60',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_61',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_62',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_63',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_64',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',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_5fbtls_5fproto_69',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_70',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_71',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_72',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_73',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_74',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_75',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_76',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_77',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_78',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_79',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_80',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_81',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_82',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_83',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_84',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_85',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_86',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_87',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_88',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_89',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_90',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_91',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_92',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_93',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_94',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_95',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_96',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_97',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_98',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_99',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_100',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_101',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_102',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_103',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_104',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_105',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_106',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_107',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_108',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_109',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_110',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_111',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_112',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_113',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.19/search/classes_0.html b/api/0.19/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/api/0.19/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.19/search/classes_0.js b/api/0.19/search/classes_0.js new file mode 100644 index 000000000..240849e0c --- /dev/null +++ b/api/0.19/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_94',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_95',['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..a933eea1a --- /dev/null +++ b/api/0.19/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/api/0.19/search/defines_0.html b/api/0.19/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/api/0.19/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.19/search/defines_0.js b/api/0.19/search/defines_0.js new file mode 100644 index 000000000..c0aa0f62c --- /dev/null +++ b/api/0.19/search/defines_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_173',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_174',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_175',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_176',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_177',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_178',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_179',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_180',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_181',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_182',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_183',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_184',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_185',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_186',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.19/search/enums_0.html b/api/0.19/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/api/0.19/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.19/search/enums_0.js b/api/0.19/search/enums_0.js new file mode 100644 index 000000000..606b2c27d --- /dev/null +++ b/api/0.19/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_168',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.19/search/enumvalues_0.html b/api/0.19/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/api/0.19/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.19/search/enumvalues_0.js b/api/0.19/search/enumvalues_0.js new file mode 100644 index 000000000..b6cd1e216 --- /dev/null +++ b/api/0.19/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_169',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_170',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_171',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_172',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.19/search/files_0.html b/api/0.19/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/api/0.19/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.19/search/files_0.js b/api/0.19/search/files_0.js new file mode 100644 index 000000000..0edf827ec --- /dev/null +++ b/api/0.19/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_96',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_97',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_98',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_99',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_100',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_101',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/api/0.19/search/functions_0.html b/api/0.19/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/api/0.19/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.19/search/functions_0.js b/api/0.19/search/functions_0.js new file mode 100644 index 000000000..debccd7e3 --- /dev/null +++ b/api/0.19/search/functions_0.js @@ -0,0 +1,62 @@ +var searchData= +[ + ['xcm_5faccept_102',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_103',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_104',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_105',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_106',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_107',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_108',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_109',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_110',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_111',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_112',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_113',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_114',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_115',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_116',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_117',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_118',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_119',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_120',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_121',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_122',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_123',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_124',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_125',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_126',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_127',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_128',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_129',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_130',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_131',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_132',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_133',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_134',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_135',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_136',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_137',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_138',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_139',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_140',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_141',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_142',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_143',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_144',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_145',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_146',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_147',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_148',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_149',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_150',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_151',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_152',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_153',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_154',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_155',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_156',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_157',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_158',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_159',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_160',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.19/search/groups_0.html b/api/0.19/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/api/0.19/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.19/search/groups_0.js b/api/0.19/search/groups_0.js new file mode 100644 index 000000000..6e8756088 --- /dev/null +++ b/api/0.19/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_218',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.19/search/groups_1.html b/api/0.19/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/api/0.19/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.19/search/groups_1.js b/api/0.19/search/groups_1.js new file mode 100644 index 000000000..b1f6ca015 --- /dev/null +++ b/api/0.19/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_219',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.19/search/mag_sel.svg b/api/0.19/search/mag_sel.svg new file mode 100644 index 000000000..03626f64a --- /dev/null +++ b/api/0.19/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/api/0.19/search/nomatches.html b/api/0.19/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/api/0.19/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/api/0.19/search/pages_0.html b/api/0.19/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/api/0.19/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.19/search/pages_0.js b/api/0.19/search/pages_0.js new file mode 100644 index 000000000..b57e0eb10 --- /dev/null +++ b/api/0.19/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_187',['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..9074198f8 --- /dev/null +++ b/api/0.19/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/api/0.19/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.19/search/typedefs_0.js b/api/0.19/search/typedefs_0.js new file mode 100644 index 000000000..53403558f --- /dev/null +++ b/api/0.19/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_166',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_167',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/api/0.19/search/variables_0.html b/api/0.19/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/api/0.19/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.19/search/variables_0.js b/api/0.19/search/variables_0.js new file mode 100644 index 000000000..2b0944ffc --- /dev/null +++ b/api/0.19/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_161',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.19/search/variables_1.html b/api/0.19/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/api/0.19/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.19/search/variables_1.js b/api/0.19/search/variables_1.js new file mode 100644 index 000000000..91e927a68 --- /dev/null +++ b/api/0.19/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_162',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.19/search/variables_2.html b/api/0.19/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/api/0.19/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.19/search/variables_2.js b/api/0.19/search/variables_2.js new file mode 100644 index 000000000..3e010bbeb --- /dev/null +++ b/api/0.19/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_163',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_164',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.19/search/variables_3.html b/api/0.19/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/api/0.19/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.19/search/variables_3.js b/api/0.19/search/variables_3.js new file mode 100644 index 000000000..1cca1c7d5 --- /dev/null +++ b/api/0.19/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_165',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.19/server_accept.png b/api/0.19/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/api/0.19/server_accept.png differ diff --git a/api/0.19/splitbar.png b/api/0.19/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/api/0.19/splitbar.png differ diff --git a/api/0.19/structxcm__addr__host.html b/api/0.19/structxcm__addr__host.html new file mode 100644 index 000000000..829158f7c --- /dev/null +++ b/api/0.19/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..c5c45c665 --- /dev/null +++ b/api/0.19/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/api/0.19/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/api/0.19/xcm_8h.html b/api/0.19/xcm_8h.html new file mode 100644 index 000000000..59217e7cd --- /dev/null +++ b/api/0.19/xcm_8h.html @@ -0,0 +1,908 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..f4d4f178f --- /dev/null +++ b/api/0.19/xcm_8h_source.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1253 struct xcm_socket;
    +
    1254 
    +
    1307 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1308 
    +
    1330 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1331  const struct xcm_attr_map *attrs);
    +
    1332 
    +
    1368 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1369 
    +
    1385 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1386  const struct xcm_attr_map *attrs);
    +
    1387 
    +
    1404 int xcm_close(struct xcm_socket *socket);
    +
    1405 
    +
    1425 void xcm_cleanup(struct xcm_socket *socket);
    +
    1426 
    +
    1445 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1446 
    +
    1466 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1467  const struct xcm_attr_map *attrs);
    +
    1468 
    +
    1491 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1492 
    +
    1516 int 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 
    +
    1587 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1588 
    +
    1630 int xcm_fd(struct xcm_socket *socket);
    +
    1631 
    +
    1676 int xcm_finish(struct xcm_socket *socket);
    +
    1677 
    +
    1718 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1719 
    +
    1734 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1735 
    +
    1752 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1753 
    +
    1768 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..22d4f79c1 --- /dev/null +++ b/api/0.19/xcm__addr_8h.html @@ -0,0 +1,1070 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..4b40591ae --- /dev/null +++ b/api/0.19/xcm__addr_8h_source.html @@ -0,0 +1,199 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    44 enum 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];
    +
    63  } addr;
    +
    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 
    +
    93 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94 
    +
    108 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109  uint16_t *port);
    +
    110 
    +
    124 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125  uint16_t *port);
    +
    126 
    +
    141 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142  uint16_t *port);
    +
    143 
    +
    158 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159  uint16_t *port);
    +
    160 
    +
    174 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175 
    +
    189 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190  size_t capacity);
    +
    191 
    +
    205 int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206  uint16_t *port);
    +
    207 
    +
    223 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224  char *utls_addr_s, size_t capacity);
    +
    225 
    +
    241 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242  char *tls_addr_s, size_t capacity);
    +
    243 
    +
    259 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260  char *tcp_addr_s, size_t capacity);
    +
    261 
    +
    277 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278  char *sctp_addr_s, size_t capacity);
    +
    279 
    +
    294 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295 
    +
    310 int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311 
    +
    327 int 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..fc8058e95 --- /dev/null +++ b/api/0.19/xcm__attr_8h.html @@ -0,0 +1,614 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..3fef93a30 --- /dev/null +++ b/api/0.19/xcm__attr_8h_source.html @@ -0,0 +1,139 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89  const char *value);
    +
    90 
    +
    116 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118 
    +
    135 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136  bool *value);
    +
    137 
    +
    154 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155  int64_t *value);
    +
    156 
    +
    175 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176  char *value, size_t capacity);
    +
    177 
    +
    179 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180  void *value, size_t value_len, void *cb_data);
    +
    181 
    +
    195 void 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..0e86a6fdd --- /dev/null +++ b/api/0.19/xcm__attr__map_8h.html @@ -0,0 +1,805 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..e17ac15cb --- /dev/null +++ b/api/0.19/xcm__attr__map_8h_source.html @@ -0,0 +1,194 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name,
    +
    81  bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name,
    +
    95  int64_t attr_value);
    +
    96 
    +
    97 
    +
    107 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108  const char *attr_name,
    +
    109  const char *attr_value);
    +
    110 
    +
    111 
    +
    121 void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    122  const struct xcm_attr_map *src_map);
    +
    123 
    +
    124 
    +
    141 const 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 
    +
    161 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    162  const char *attr_name);
    +
    163 
    +
    164 
    +
    179 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    180  const char *attr_name);
    +
    181 
    +
    182 
    +
    197 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    198  const char *attr_name);
    +
    199 
    +
    208 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    209  const char *attr_name);
    +
    210 
    +
    211 
    +
    220 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    221 
    +
    222 
    +
    230 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    231 
    +
    232 
    +
    236 typedef 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 
    +
    255 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    256  xcm_attr_map_foreach_cb cb, void *user);
    +
    257 
    +
    258 
    +
    267 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    268  const struct xcm_attr_map *attr_map_b);
    +
    269 
    +
    278 void 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)
    +
    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)
    +
    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 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 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..9b93179e4 --- /dev/null +++ b/api/0.19/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..e894fa06d --- /dev/null +++ b/api/0.19/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..43bce8122 --- /dev/null +++ b/api/0.19/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..e21d487a3 --- /dev/null +++ b/api/0.19/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..0f81b8615 --- /dev/null +++ b/api/0.19/xcm__version_8h.html @@ -0,0 +1,372 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..e4c287334 --- /dev/null +++ b/api/0.19/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    47 unsigned int xcm_version_major(void);
    +
    48 
    +
    55 unsigned int xcm_version_minor(void);
    +
    56 
    +
    62 unsigned int xcm_version_patch(void);
    +
    63 
    +
    72 const char *xcm_version(void);
    +
    73 
    +
    79 unsigned int xcm_version_api_major(void);
    +
    80 
    +
    86 unsigned int xcm_version_api_minor(void);
    +
    87 
    +
    96 const char *xcm_version_api(void);
    +
    97 
    +
    98 #ifdef __cplusplus
    +
    99 }
    +
    100 #endif
    +
    101 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..b65b857ec --- /dev/null +++ b/api/0.20/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/api/0.20/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/api/0.20/bdwn.png differ diff --git a/api/0.20/classes.html b/api/0.20/classes.html new file mode 100644 index 000000000..0a59873bd --- /dev/null +++ b/api/0.20/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..ad47f616f --- /dev/null +++ b/api/0.20/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,103 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    file  xcm_version.h [code]
     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.png b/api/0.20/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/api/0.20/doc.png differ diff --git a/api/0.20/doxygen.css b/api/0.20/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/api/0.20/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/api/0.20/doxygen.svg b/api/0.20/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/api/0.20/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.20/dynsections.js b/api/0.20/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/api/0.20/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/api/0.20/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/api/0.20/folderclosed.png differ diff --git a/api/0.20/folderopen.png b/api/0.20/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/api/0.20/folderopen.png differ diff --git a/api/0.20/functions.html b/api/0.20/functions.html new file mode 100644 index 000000000..62326a4f9 --- /dev/null +++ b/api/0.20/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..021cc3e0a --- /dev/null +++ b/api/0.20/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.20/globals.html b/api/0.20/globals.html new file mode 100644 index 000000000..024847882 --- /dev/null +++ b/api/0.20/globals.html @@ -0,0 +1,356 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..a047fe197 --- /dev/null +++ b/api/0.20/globals_defs.html @@ -0,0 +1,135 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.20/globals_enum.html b/api/0.20/globals_enum.html new file mode 100644 index 000000000..e6367f9f6 --- /dev/null +++ b/api/0.20/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.20/globals_eval.html b/api/0.20/globals_eval.html new file mode 100644 index 000000000..887d1e9bf --- /dev/null +++ b/api/0.20/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.20/globals_func.html b/api/0.20/globals_func.html new file mode 100644 index 000000000..2cda05362 --- /dev/null +++ b/api/0.20/globals_func.html @@ -0,0 +1,272 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - x -

    +
    + + + + diff --git a/api/0.20/globals_type.html b/api/0.20/globals_type.html new file mode 100644 index 000000000..145ca84c1 --- /dev/null +++ b/api/0.20/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.20/group__api__version.html b/api/0.20/group__api__version.html new file mode 100644 index 000000000..f1f415f35 --- /dev/null +++ b/api/0.20/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..990209c97 --- /dev/null +++ b/api/0.20/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..d1376333f --- /dev/null +++ b/api/0.20/index.html @@ -0,0 +1,621 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/api/0.20/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/api/0.20/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/api/0.20/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/api/0.20/modules.html new file mode 100644 index 000000000..6e4ef3786 --- /dev/null +++ b/api/0.20/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/api/0.20/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..e1c7e12e8 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/api/0.20/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/api/0.20/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.20/search/all_0.js b/api/0.20/search/all_0.js new file mode 100644 index 000000000..7130f6379 --- /dev/null +++ b/api/0.20/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.20/search/all_1.html b/api/0.20/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/api/0.20/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.20/search/all_1.js b/api/0.20/search/all_1.js new file mode 100644 index 000000000..69f82ad46 --- /dev/null +++ b/api/0.20/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.20/search/all_2.html b/api/0.20/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/api/0.20/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.20/search/all_2.js b/api/0.20/search/all_2.js new file mode 100644 index 000000000..ae6e4d753 --- /dev/null +++ b/api/0.20/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.20/search/all_3.html b/api/0.20/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/api/0.20/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.20/search/all_3.js b/api/0.20/search/all_3.js new file mode 100644 index 000000000..551054f77 --- /dev/null +++ b/api/0.20/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.20/search/all_4.html b/api/0.20/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/api/0.20/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.20/search/all_4.js b/api/0.20/search/all_4.js new file mode 100644 index 000000000..fd3d5a006 --- /dev/null +++ b/api/0.20/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.20/search/all_5.html b/api/0.20/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/api/0.20/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.20/search/all_5.js b/api/0.20/search/all_5.js new file mode 100644 index 000000000..5273f9abc --- /dev/null +++ b/api/0.20/search/all_5.js @@ -0,0 +1,106 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_8',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_9',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_10',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_11',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_12',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_13',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_14',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_15',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_16',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_17',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_18',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_19',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_20',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_21',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_22',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_23',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_24',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_25',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_26',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_27',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_28',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_29',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_30',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',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_5fint64_32',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_33',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_34',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['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_5fbool_37',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_38',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_39',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_40',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_41',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_42',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_43',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_44',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_45',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_46',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_47',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_48',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_49',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_50',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_51',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_52',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_53',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_54',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_55',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_56',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_57',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_58',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_59',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_60',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_61',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_62',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_63',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_64',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_65',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_66',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_67',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_68',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_69',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_70',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_71',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_72',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_73',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_74',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_75',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_76',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_77',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_78',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_79',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_80',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_81',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_82',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_83',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_84',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_85',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_86',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_87',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_88',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_89',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_90',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_91',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_92',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_93',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_94',['XCM_VERSION',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_95',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_96',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_97',['XCM_VERSION_API',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_98',['XCM_VERSION_API_MAJOR',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_99',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_100',['XCM_VERSION_API_MINOR',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_101',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_102',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_103',['XCM_VERSION_MAJOR',['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_104',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_105',['XCM_VERSION_MINOR',['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_106',['XCM_VERSION_PATCH',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_107',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_108',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.20/search/all_6.html b/api/0.20/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/api/0.20/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.20/search/all_6.js b/api/0.20/search/all_6.js new file mode 100644 index 000000000..5411ca92b --- /dev/null +++ b/api/0.20/search/all_6.js @@ -0,0 +1,109 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_14',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_15',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_16',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_17',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_18',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_19',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_20',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_21',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_22',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_23',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_24',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_25',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_26',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_27',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_28',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_29',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_30',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_31',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_32',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_33',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_34',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_35',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_36',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_37',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_38',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_39',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_40',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_41',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_42',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_43',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_44',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_45',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_46',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_47',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_48',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_49',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_50',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_51',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_52',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_53',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_54',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_55',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_56',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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_5fint64_60',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_61',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_62',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_63',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_64',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',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_5fbtls_5fproto_69',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_70',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_71',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_72',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_73',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_74',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_75',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_76',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_77',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_78',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_79',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_80',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_81',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_82',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_83',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_84',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_85',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_86',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_87',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_88',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_89',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_90',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_91',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_92',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_93',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_94',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_95',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_96',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_97',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_98',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_99',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_100',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_101',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_102',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_103',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_104',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_105',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_106',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_107',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_108',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_109',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_110',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_111',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_112',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_113',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.20/search/classes_0.html b/api/0.20/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/api/0.20/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.20/search/classes_0.js b/api/0.20/search/classes_0.js new file mode 100644 index 000000000..a2e56ee61 --- /dev/null +++ b/api/0.20/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_109',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_110',['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..a933eea1a --- /dev/null +++ b/api/0.20/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/api/0.20/search/defines_0.html b/api/0.20/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/api/0.20/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.20/search/defines_0.js b/api/0.20/search/defines_0.js new file mode 100644 index 000000000..e8b050945 --- /dev/null +++ b/api/0.20/search/defines_0.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_196',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_197',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_198',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_199',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_200',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_201',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_202',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_203',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_204',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_205',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_206',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_207',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_208',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_209',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_210',['XCM_VERSION',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_211',['XCM_VERSION_API',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_212',['XCM_VERSION_API_MAJOR',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_213',['XCM_VERSION_API_MINOR',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_214',['XCM_VERSION_MAJOR',['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_215',['XCM_VERSION_MINOR',['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_216',['XCM_VERSION_PATCH',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]] +]; diff --git a/api/0.20/search/enums_0.html b/api/0.20/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/api/0.20/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.20/search/enums_0.js b/api/0.20/search/enums_0.js new file mode 100644 index 000000000..14e43419a --- /dev/null +++ b/api/0.20/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_191',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.20/search/enumvalues_0.html b/api/0.20/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/api/0.20/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.20/search/enumvalues_0.js b/api/0.20/search/enumvalues_0.js new file mode 100644 index 000000000..47eaf0ba8 --- /dev/null +++ b/api/0.20/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_192',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_193',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_194',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_195',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.20/search/files_0.html b/api/0.20/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/api/0.20/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.20/search/files_0.js b/api/0.20/search/files_0.js new file mode 100644 index 000000000..49cc3f564 --- /dev/null +++ b/api/0.20/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_111',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_112',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_113',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_114',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_115',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_116',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_117',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/api/0.20/search/functions_0.html b/api/0.20/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/api/0.20/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.20/search/functions_0.js b/api/0.20/search/functions_0.js new file mode 100644 index 000000000..0df50007a --- /dev/null +++ b/api/0.20/search/functions_0.js @@ -0,0 +1,69 @@ +var searchData= +[ + ['xcm_5faccept_118',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_119',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_120',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_121',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_122',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_123',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_124',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_125',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_126',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_127',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_128',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_129',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_130',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_131',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_132',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_133',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_134',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_135',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_136',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_137',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_138',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_139',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_140',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_141',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_142',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_143',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_144',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_145',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_146',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_147',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_148',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_149',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_150',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_151',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_152',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_153',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_154',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_155',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_156',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_157',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_158',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_159',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_160',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_161',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_162',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_163',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_164',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_165',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_166',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_167',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_168',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_169',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_170',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_171',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_172',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_173',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_174',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_175',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_176',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_177',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_178',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_179',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_180',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_181',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_182',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_183',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.20/search/groups_0.html b/api/0.20/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/api/0.20/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.20/search/groups_0.js b/api/0.20/search/groups_0.js new file mode 100644 index 000000000..6e8756088 --- /dev/null +++ b/api/0.20/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_218',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.20/search/groups_1.html b/api/0.20/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/api/0.20/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.20/search/groups_1.js b/api/0.20/search/groups_1.js new file mode 100644 index 000000000..b1f6ca015 --- /dev/null +++ b/api/0.20/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_219',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.20/search/mag_sel.svg b/api/0.20/search/mag_sel.svg new file mode 100644 index 000000000..03626f64a --- /dev/null +++ b/api/0.20/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/api/0.20/search/nomatches.html b/api/0.20/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/api/0.20/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/api/0.20/search/pages_0.html b/api/0.20/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/api/0.20/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.20/search/pages_0.js b/api/0.20/search/pages_0.js new file mode 100644 index 000000000..5b432bae5 --- /dev/null +++ b/api/0.20/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_217',['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..9074198f8 --- /dev/null +++ b/api/0.20/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/api/0.20/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.20/search/typedefs_0.js b/api/0.20/search/typedefs_0.js new file mode 100644 index 000000000..9c9abbd1f --- /dev/null +++ b/api/0.20/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_189',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_190',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/api/0.20/search/variables_0.html b/api/0.20/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/api/0.20/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.20/search/variables_0.js b/api/0.20/search/variables_0.js new file mode 100644 index 000000000..3205b1959 --- /dev/null +++ b/api/0.20/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_184',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.20/search/variables_1.html b/api/0.20/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/api/0.20/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.20/search/variables_1.js b/api/0.20/search/variables_1.js new file mode 100644 index 000000000..b2effea2c --- /dev/null +++ b/api/0.20/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_185',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.20/search/variables_2.html b/api/0.20/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/api/0.20/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.20/search/variables_2.js b/api/0.20/search/variables_2.js new file mode 100644 index 000000000..5cda77d5d --- /dev/null +++ b/api/0.20/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_186',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_187',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.20/search/variables_3.html b/api/0.20/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/api/0.20/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.20/search/variables_3.js b/api/0.20/search/variables_3.js new file mode 100644 index 000000000..df0550499 --- /dev/null +++ b/api/0.20/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_188',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.20/server_accept.png b/api/0.20/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/api/0.20/server_accept.png differ diff --git a/api/0.20/splitbar.png b/api/0.20/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/api/0.20/splitbar.png differ diff --git a/api/0.20/structxcm__addr__host.html b/api/0.20/structxcm__addr__host.html new file mode 100644 index 000000000..f0f2721e0 --- /dev/null +++ b/api/0.20/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..cbc052eef --- /dev/null +++ b/api/0.20/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/api/0.20/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/api/0.20/xcm_8h.html b/api/0.20/xcm_8h.html new file mode 100644 index 000000000..66d3e123d --- /dev/null +++ b/api/0.20/xcm_8h.html @@ -0,0 +1,908 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..39888fc75 --- /dev/null +++ b/api/0.20/xcm_8h_source.html @@ -0,0 +1,164 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1254 struct xcm_socket;
    +
    1255 
    +
    1308 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1309 
    +
    1331 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1332  const struct xcm_attr_map *attrs);
    +
    1333 
    +
    1369 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1370 
    +
    1386 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1387  const struct xcm_attr_map *attrs);
    +
    1388 
    +
    1405 int xcm_close(struct xcm_socket *socket);
    +
    1406 
    +
    1426 void xcm_cleanup(struct xcm_socket *socket);
    +
    1427 
    +
    1446 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1447 
    +
    1467 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1468  const struct xcm_attr_map *attrs);
    +
    1469 
    +
    1492 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1493 
    +
    1517 int 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 
    +
    1588 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1589 
    +
    1631 int xcm_fd(struct xcm_socket *socket);
    +
    1632 
    +
    1677 int xcm_finish(struct xcm_socket *socket);
    +
    1678 
    +
    1719 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1720 
    +
    1735 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1736 
    +
    1753 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1754 
    +
    1769 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..645ad1079 --- /dev/null +++ b/api/0.20/xcm__addr_8h.html @@ -0,0 +1,1070 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..8012b6fbc --- /dev/null +++ b/api/0.20/xcm__addr_8h_source.html @@ -0,0 +1,199 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    44 enum 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];
    +
    63  } addr;
    +
    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 
    +
    93 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94 
    +
    108 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109  uint16_t *port);
    +
    110 
    +
    124 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125  uint16_t *port);
    +
    126 
    +
    141 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142  uint16_t *port);
    +
    143 
    +
    158 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159  uint16_t *port);
    +
    160 
    +
    174 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175 
    +
    189 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190  size_t capacity);
    +
    191 
    +
    205 int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206  uint16_t *port);
    +
    207 
    +
    223 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224  char *utls_addr_s, size_t capacity);
    +
    225 
    +
    241 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242  char *tls_addr_s, size_t capacity);
    +
    243 
    +
    259 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260  char *tcp_addr_s, size_t capacity);
    +
    261 
    +
    277 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278  char *sctp_addr_s, size_t capacity);
    +
    279 
    +
    294 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295 
    +
    310 int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311 
    +
    327 int 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..95c146c62 --- /dev/null +++ b/api/0.20/xcm__attr_8h.html @@ -0,0 +1,614 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..ab77a2eab --- /dev/null +++ b/api/0.20/xcm__attr_8h_source.html @@ -0,0 +1,139 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89  const char *value);
    +
    90 
    +
    116 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118 
    +
    135 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136  bool *value);
    +
    137 
    +
    154 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155  int64_t *value);
    +
    156 
    +
    175 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176  char *value, size_t capacity);
    +
    177 
    +
    179 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180  void *value, size_t value_len, void *cb_data);
    +
    181 
    +
    195 void 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..6c1acc233 --- /dev/null +++ b/api/0.20/xcm__attr__map_8h.html @@ -0,0 +1,805 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..99d23299d --- /dev/null +++ b/api/0.20/xcm__attr__map_8h_source.html @@ -0,0 +1,194 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name,
    +
    81  bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name,
    +
    95  int64_t attr_value);
    +
    96 
    +
    97 
    +
    107 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108  const char *attr_name,
    +
    109  const char *attr_value);
    +
    110 
    +
    111 
    +
    121 void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    122  const struct xcm_attr_map *src_map);
    +
    123 
    +
    124 
    +
    141 const 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 
    +
    161 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    162  const char *attr_name);
    +
    163 
    +
    164 
    +
    179 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    180  const char *attr_name);
    +
    181 
    +
    182 
    +
    197 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    198  const char *attr_name);
    +
    199 
    +
    208 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    209  const char *attr_name);
    +
    210 
    +
    211 
    +
    220 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    221 
    +
    222 
    +
    230 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    231 
    +
    232 
    +
    236 typedef 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 
    +
    255 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    256  xcm_attr_map_foreach_cb cb, void *user);
    +
    257 
    +
    258 
    +
    267 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    268  const struct xcm_attr_map *attr_map_b);
    +
    269 
    +
    278 void 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)
    +
    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)
    +
    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 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 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..1853151c5 --- /dev/null +++ b/api/0.20/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..cf423a3ec --- /dev/null +++ b/api/0.20/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..6b0d5081b --- /dev/null +++ b/api/0.20/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..36b593547 --- /dev/null +++ b/api/0.20/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..0f81b8615 --- /dev/null +++ b/api/0.20/xcm__version_8h.html @@ -0,0 +1,372 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..e4c287334 --- /dev/null +++ b/api/0.20/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    47 unsigned int xcm_version_major(void);
    +
    48 
    +
    55 unsigned int xcm_version_minor(void);
    +
    56 
    +
    62 unsigned int xcm_version_patch(void);
    +
    63 
    +
    72 const char *xcm_version(void);
    +
    73 
    +
    79 unsigned int xcm_version_api_major(void);
    +
    80 
    +
    86 unsigned int xcm_version_api_minor(void);
    +
    87 
    +
    96 const char *xcm_version_api(void);
    +
    97 
    +
    98 #ifdef __cplusplus
    +
    99 }
    +
    100 #endif
    +
    101 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..8ff189baf --- /dev/null +++ b/api/0.21/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/api/0.21/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/api/0.21/bdwn.png differ diff --git a/api/0.21/classes.html b/api/0.21/classes.html new file mode 100644 index 000000000..17d9cc4f5 --- /dev/null +++ b/api/0.21/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..d1716de95 --- /dev/null +++ b/api/0.21/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,103 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    file  xcm_version.h [code]
     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.png b/api/0.21/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/api/0.21/doc.png differ diff --git a/api/0.21/doxygen.css b/api/0.21/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/api/0.21/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/api/0.21/doxygen.svg b/api/0.21/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/api/0.21/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.21/dynsections.js b/api/0.21/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/api/0.21/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/api/0.21/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/api/0.21/folderclosed.png differ diff --git a/api/0.21/folderopen.png b/api/0.21/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/api/0.21/folderopen.png differ diff --git a/api/0.21/functions.html b/api/0.21/functions.html new file mode 100644 index 000000000..eca3b4053 --- /dev/null +++ b/api/0.21/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..851e070a4 --- /dev/null +++ b/api/0.21/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.21/globals.html b/api/0.21/globals.html new file mode 100644 index 000000000..08d9232d4 --- /dev/null +++ b/api/0.21/globals.html @@ -0,0 +1,356 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..43392ca59 --- /dev/null +++ b/api/0.21/globals_defs.html @@ -0,0 +1,135 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.21/globals_enum.html b/api/0.21/globals_enum.html new file mode 100644 index 000000000..db9f62ccf --- /dev/null +++ b/api/0.21/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.21/globals_eval.html b/api/0.21/globals_eval.html new file mode 100644 index 000000000..be62405a3 --- /dev/null +++ b/api/0.21/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.21/globals_func.html b/api/0.21/globals_func.html new file mode 100644 index 000000000..a0dd9ad95 --- /dev/null +++ b/api/0.21/globals_func.html @@ -0,0 +1,272 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - x -

    +
    + + + + diff --git a/api/0.21/globals_type.html b/api/0.21/globals_type.html new file mode 100644 index 000000000..ac3f7ee8f --- /dev/null +++ b/api/0.21/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.21/group__api__version.html b/api/0.21/group__api__version.html new file mode 100644 index 000000000..f1f415f35 --- /dev/null +++ b/api/0.21/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..990209c97 --- /dev/null +++ b/api/0.21/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..b2a37b027 --- /dev/null +++ b/api/0.21/index.html @@ -0,0 +1,629 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/api/0.21/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/api/0.21/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/api/0.21/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/api/0.21/modules.html new file mode 100644 index 000000000..6e4ef3786 --- /dev/null +++ b/api/0.21/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/api/0.21/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..e1c7e12e8 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/api/0.21/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/api/0.21/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.21/search/all_0.js b/api/0.21/search/all_0.js new file mode 100644 index 000000000..7130f6379 --- /dev/null +++ b/api/0.21/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.21/search/all_1.html b/api/0.21/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/api/0.21/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.21/search/all_1.js b/api/0.21/search/all_1.js new file mode 100644 index 000000000..69f82ad46 --- /dev/null +++ b/api/0.21/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.21/search/all_2.html b/api/0.21/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/api/0.21/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.21/search/all_2.js b/api/0.21/search/all_2.js new file mode 100644 index 000000000..ae6e4d753 --- /dev/null +++ b/api/0.21/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.21/search/all_3.html b/api/0.21/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/api/0.21/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.21/search/all_3.js b/api/0.21/search/all_3.js new file mode 100644 index 000000000..551054f77 --- /dev/null +++ b/api/0.21/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.21/search/all_4.html b/api/0.21/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/api/0.21/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.21/search/all_4.js b/api/0.21/search/all_4.js new file mode 100644 index 000000000..fd3d5a006 --- /dev/null +++ b/api/0.21/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.21/search/all_5.html b/api/0.21/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/api/0.21/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.21/search/all_5.js b/api/0.21/search/all_5.js new file mode 100644 index 000000000..5273f9abc --- /dev/null +++ b/api/0.21/search/all_5.js @@ -0,0 +1,106 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_8',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_9',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_10',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_11',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_12',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_13',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_14',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_15',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_16',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_17',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_18',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_19',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_20',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_21',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_22',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_23',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_24',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_25',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_26',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_27',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_28',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_29',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_30',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',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_5fint64_32',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_33',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_34',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['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_5fbool_37',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_38',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_39',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_40',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_41',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_42',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_43',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_44',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_45',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_46',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_47',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_48',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_49',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_50',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_51',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_52',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_53',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_54',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_55',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_56',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_57',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_58',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_59',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_60',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_61',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_62',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_63',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_64',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_65',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_66',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_67',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_68',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_69',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_70',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_71',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_72',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_73',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_74',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_75',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_76',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_77',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_78',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_79',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_80',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_81',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_82',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_83',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_84',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_85',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_86',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_87',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_88',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_89',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_90',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_91',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_92',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_93',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_94',['XCM_VERSION',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_95',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_96',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_97',['XCM_VERSION_API',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_98',['XCM_VERSION_API_MAJOR',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_99',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_100',['XCM_VERSION_API_MINOR',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_101',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_102',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_103',['XCM_VERSION_MAJOR',['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_104',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_105',['XCM_VERSION_MINOR',['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_106',['XCM_VERSION_PATCH',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_107',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_108',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.21/search/all_6.html b/api/0.21/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/api/0.21/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.21/search/all_6.js b/api/0.21/search/all_6.js new file mode 100644 index 000000000..5411ca92b --- /dev/null +++ b/api/0.21/search/all_6.js @@ -0,0 +1,109 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_14',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_15',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_16',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_17',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_18',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_19',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_20',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_21',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_22',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_23',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_24',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_25',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_26',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_27',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_28',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_29',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_30',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_31',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_32',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_33',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_34',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_35',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_36',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_37',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_38',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_39',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_40',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_41',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_42',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_43',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_44',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_45',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_46',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_47',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_48',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_49',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_50',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_51',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_52',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_53',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_54',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_55',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_56',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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_5fint64_60',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_61',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_62',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_63',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_64',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',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_5fbtls_5fproto_69',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_70',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_71',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_72',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_73',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_74',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_75',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_76',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_77',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_78',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_79',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_80',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_81',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_82',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_83',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_84',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_85',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_86',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_87',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_88',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_89',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_90',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_91',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_92',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_93',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_94',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_95',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_96',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_97',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_98',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_99',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_100',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_101',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_102',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_103',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_104',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_105',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_106',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_107',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_108',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_109',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_110',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_111',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_112',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_113',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.21/search/classes_0.html b/api/0.21/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/api/0.21/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.21/search/classes_0.js b/api/0.21/search/classes_0.js new file mode 100644 index 000000000..a2e56ee61 --- /dev/null +++ b/api/0.21/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_109',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_110',['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..a933eea1a --- /dev/null +++ b/api/0.21/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/api/0.21/search/defines_0.html b/api/0.21/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/api/0.21/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.21/search/defines_0.js b/api/0.21/search/defines_0.js new file mode 100644 index 000000000..e8b050945 --- /dev/null +++ b/api/0.21/search/defines_0.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_196',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_197',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_198',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_199',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_200',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_201',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_202',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_203',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_204',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_205',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_206',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_207',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_208',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_209',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_210',['XCM_VERSION',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_211',['XCM_VERSION_API',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_212',['XCM_VERSION_API_MAJOR',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_213',['XCM_VERSION_API_MINOR',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_214',['XCM_VERSION_MAJOR',['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_215',['XCM_VERSION_MINOR',['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_216',['XCM_VERSION_PATCH',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]] +]; diff --git a/api/0.21/search/enums_0.html b/api/0.21/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/api/0.21/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.21/search/enums_0.js b/api/0.21/search/enums_0.js new file mode 100644 index 000000000..14e43419a --- /dev/null +++ b/api/0.21/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_191',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.21/search/enumvalues_0.html b/api/0.21/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/api/0.21/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.21/search/enumvalues_0.js b/api/0.21/search/enumvalues_0.js new file mode 100644 index 000000000..47eaf0ba8 --- /dev/null +++ b/api/0.21/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_192',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_193',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_194',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_195',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.21/search/files_0.html b/api/0.21/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/api/0.21/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.21/search/files_0.js b/api/0.21/search/files_0.js new file mode 100644 index 000000000..49cc3f564 --- /dev/null +++ b/api/0.21/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_111',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_112',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_113',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_114',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_115',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_116',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_117',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/api/0.21/search/functions_0.html b/api/0.21/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/api/0.21/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.21/search/functions_0.js b/api/0.21/search/functions_0.js new file mode 100644 index 000000000..0df50007a --- /dev/null +++ b/api/0.21/search/functions_0.js @@ -0,0 +1,69 @@ +var searchData= +[ + ['xcm_5faccept_118',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_119',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_120',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_121',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_122',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_123',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_124',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_125',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_126',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_127',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_128',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_129',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_130',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_131',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_132',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_133',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_134',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_135',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_136',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_137',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_138',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_139',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_140',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_141',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_142',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_143',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_144',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_145',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_146',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_147',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_148',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_149',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_150',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_151',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_152',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_153',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_154',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_155',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_156',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_157',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_158',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_159',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_160',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_161',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_162',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_163',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_164',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_165',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_166',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_167',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_168',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_169',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_170',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_171',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_172',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_173',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_174',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_175',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_176',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_177',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_178',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_179',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_180',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_181',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_182',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_183',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.21/search/groups_0.html b/api/0.21/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/api/0.21/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.21/search/groups_0.js b/api/0.21/search/groups_0.js new file mode 100644 index 000000000..6e8756088 --- /dev/null +++ b/api/0.21/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_218',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.21/search/groups_1.html b/api/0.21/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/api/0.21/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.21/search/groups_1.js b/api/0.21/search/groups_1.js new file mode 100644 index 000000000..b1f6ca015 --- /dev/null +++ b/api/0.21/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_219',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.21/search/mag_sel.svg b/api/0.21/search/mag_sel.svg new file mode 100644 index 000000000..03626f64a --- /dev/null +++ b/api/0.21/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/api/0.21/search/nomatches.html b/api/0.21/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/api/0.21/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/api/0.21/search/pages_0.html b/api/0.21/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/api/0.21/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.21/search/pages_0.js b/api/0.21/search/pages_0.js new file mode 100644 index 000000000..5b432bae5 --- /dev/null +++ b/api/0.21/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_217',['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..9074198f8 --- /dev/null +++ b/api/0.21/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/api/0.21/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.21/search/typedefs_0.js b/api/0.21/search/typedefs_0.js new file mode 100644 index 000000000..9c9abbd1f --- /dev/null +++ b/api/0.21/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_189',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_190',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/api/0.21/search/variables_0.html b/api/0.21/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/api/0.21/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.21/search/variables_0.js b/api/0.21/search/variables_0.js new file mode 100644 index 000000000..3205b1959 --- /dev/null +++ b/api/0.21/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_184',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.21/search/variables_1.html b/api/0.21/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/api/0.21/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.21/search/variables_1.js b/api/0.21/search/variables_1.js new file mode 100644 index 000000000..b2effea2c --- /dev/null +++ b/api/0.21/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_185',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.21/search/variables_2.html b/api/0.21/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/api/0.21/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.21/search/variables_2.js b/api/0.21/search/variables_2.js new file mode 100644 index 000000000..5cda77d5d --- /dev/null +++ b/api/0.21/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_186',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_187',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.21/search/variables_3.html b/api/0.21/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/api/0.21/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.21/search/variables_3.js b/api/0.21/search/variables_3.js new file mode 100644 index 000000000..df0550499 --- /dev/null +++ b/api/0.21/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_188',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.21/server_accept.png b/api/0.21/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/api/0.21/server_accept.png differ diff --git a/api/0.21/splitbar.png b/api/0.21/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/api/0.21/splitbar.png differ diff --git a/api/0.21/structxcm__addr__host.html b/api/0.21/structxcm__addr__host.html new file mode 100644 index 000000000..2696a0b89 --- /dev/null +++ b/api/0.21/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..6a0f12063 --- /dev/null +++ b/api/0.21/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/api/0.21/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/api/0.21/xcm_8h.html b/api/0.21/xcm_8h.html new file mode 100644 index 000000000..a1be03bd7 --- /dev/null +++ b/api/0.21/xcm_8h.html @@ -0,0 +1,908 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..0094f0aaf --- /dev/null +++ b/api/0.21/xcm_8h_source.html @@ -0,0 +1,164 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1275 struct xcm_socket;
    +
    1276 
    +
    1329 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1330 
    +
    1352 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1353  const struct xcm_attr_map *attrs);
    +
    1354 
    +
    1390 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1391 
    +
    1407 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1408  const struct xcm_attr_map *attrs);
    +
    1409 
    +
    1426 int xcm_close(struct xcm_socket *socket);
    +
    1427 
    +
    1447 void xcm_cleanup(struct xcm_socket *socket);
    +
    1448 
    +
    1467 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1468 
    +
    1488 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1489  const struct xcm_attr_map *attrs);
    +
    1490 
    +
    1513 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1514 
    +
    1538 int 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 
    +
    1609 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1610 
    +
    1652 int xcm_fd(struct xcm_socket *socket);
    +
    1653 
    +
    1698 int xcm_finish(struct xcm_socket *socket);
    +
    1699 
    +
    1740 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1741 
    +
    1756 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1757 
    +
    1774 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1775 
    +
    1790 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..4769e4519 --- /dev/null +++ b/api/0.21/xcm__addr_8h.html @@ -0,0 +1,1070 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..2d24146b8 --- /dev/null +++ b/api/0.21/xcm__addr_8h_source.html @@ -0,0 +1,199 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    44 enum 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];
    +
    63  } addr;
    +
    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 
    +
    93 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94 
    +
    108 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109  uint16_t *port);
    +
    110 
    +
    124 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125  uint16_t *port);
    +
    126 
    +
    141 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142  uint16_t *port);
    +
    143 
    +
    158 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159  uint16_t *port);
    +
    160 
    +
    174 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175 
    +
    189 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190  size_t capacity);
    +
    191 
    +
    205 int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206  uint16_t *port);
    +
    207 
    +
    223 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224  char *utls_addr_s, size_t capacity);
    +
    225 
    +
    241 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242  char *tls_addr_s, size_t capacity);
    +
    243 
    +
    259 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260  char *tcp_addr_s, size_t capacity);
    +
    261 
    +
    277 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278  char *sctp_addr_s, size_t capacity);
    +
    279 
    +
    294 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295 
    +
    310 int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311 
    +
    327 int 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..6997eb95a --- /dev/null +++ b/api/0.21/xcm__attr_8h.html @@ -0,0 +1,614 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..4ecc71575 --- /dev/null +++ b/api/0.21/xcm__attr_8h_source.html @@ -0,0 +1,139 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89  const char *value);
    +
    90 
    +
    116 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118 
    +
    135 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136  bool *value);
    +
    137 
    +
    154 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155  int64_t *value);
    +
    156 
    +
    175 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176  char *value, size_t capacity);
    +
    177 
    +
    179 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180  void *value, size_t value_len, void *cb_data);
    +
    181 
    +
    195 void 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..fa3070d6a --- /dev/null +++ b/api/0.21/xcm__attr__map_8h.html @@ -0,0 +1,805 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..836d1384f --- /dev/null +++ b/api/0.21/xcm__attr__map_8h_source.html @@ -0,0 +1,194 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name,
    +
    81  bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name,
    +
    95  int64_t attr_value);
    +
    96 
    +
    97 
    +
    107 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108  const char *attr_name,
    +
    109  const char *attr_value);
    +
    110 
    +
    111 
    +
    121 void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    122  const struct xcm_attr_map *src_map);
    +
    123 
    +
    124 
    +
    141 const 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 
    +
    161 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    162  const char *attr_name);
    +
    163 
    +
    164 
    +
    179 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    180  const char *attr_name);
    +
    181 
    +
    182 
    +
    197 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    198  const char *attr_name);
    +
    199 
    +
    208 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    209  const char *attr_name);
    +
    210 
    +
    211 
    +
    220 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    221 
    +
    222 
    +
    230 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    231 
    +
    232 
    +
    236 typedef 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 
    +
    255 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    256  xcm_attr_map_foreach_cb cb, void *user);
    +
    257 
    +
    258 
    +
    267 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    268  const struct xcm_attr_map *attr_map_b);
    +
    269 
    +
    278 void 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)
    +
    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)
    +
    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 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 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..a79574e0c --- /dev/null +++ b/api/0.21/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..1b003d712 --- /dev/null +++ b/api/0.21/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..13556fb10 --- /dev/null +++ b/api/0.21/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..62520e8d1 --- /dev/null +++ b/api/0.21/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..2d6d2f2e2 --- /dev/null +++ b/api/0.21/xcm__version_8h.html @@ -0,0 +1,372 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..2c2c8318c --- /dev/null +++ b/api/0.21/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    47 unsigned int xcm_version_major(void);
    +
    48 
    +
    55 unsigned int xcm_version_minor(void);
    +
    56 
    +
    62 unsigned int xcm_version_patch(void);
    +
    63 
    +
    72 const char *xcm_version(void);
    +
    73 
    +
    79 unsigned int xcm_version_api_major(void);
    +
    80 
    +
    86 unsigned int xcm_version_api_minor(void);
    +
    87 
    +
    96 const char *xcm_version_api(void);
    +
    97 
    +
    98 #ifdef __cplusplus
    +
    99 }
    +
    100 #endif
    +
    101 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..a078a220b --- /dev/null +++ b/api/0.22/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/api/0.22/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/api/0.22/bdwn.png differ diff --git a/api/0.22/classes.html b/api/0.22/classes.html new file mode 100644 index 000000000..05086f054 --- /dev/null +++ b/api/0.22/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..62c89d4fb --- /dev/null +++ b/api/0.22/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,103 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    file  xcm_version.h [code]
     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.png b/api/0.22/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/api/0.22/doc.png differ diff --git a/api/0.22/doxygen.css b/api/0.22/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/api/0.22/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/api/0.22/doxygen.svg b/api/0.22/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/api/0.22/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.22/dynsections.js b/api/0.22/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/api/0.22/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/api/0.22/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/api/0.22/folderclosed.png differ diff --git a/api/0.22/folderopen.png b/api/0.22/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/api/0.22/folderopen.png differ diff --git a/api/0.22/functions.html b/api/0.22/functions.html new file mode 100644 index 000000000..56992d78f --- /dev/null +++ b/api/0.22/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..d7a6c311c --- /dev/null +++ b/api/0.22/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.22/globals.html b/api/0.22/globals.html new file mode 100644 index 000000000..77addc8e2 --- /dev/null +++ b/api/0.22/globals.html @@ -0,0 +1,365 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..92b0de83e --- /dev/null +++ b/api/0.22/globals_defs.html @@ -0,0 +1,135 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.22/globals_enum.html b/api/0.22/globals_enum.html new file mode 100644 index 000000000..61d780270 --- /dev/null +++ b/api/0.22/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.22/globals_eval.html b/api/0.22/globals_eval.html new file mode 100644 index 000000000..f6b9b25eb --- /dev/null +++ b/api/0.22/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.22/globals_func.html b/api/0.22/globals_func.html new file mode 100644 index 000000000..06c5b7531 --- /dev/null +++ b/api/0.22/globals_func.html @@ -0,0 +1,281 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - x -

    +
    + + + + diff --git a/api/0.22/globals_type.html b/api/0.22/globals_type.html new file mode 100644 index 000000000..34bf1ea23 --- /dev/null +++ b/api/0.22/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.22/group__api__version.html b/api/0.22/group__api__version.html new file mode 100644 index 000000000..f1f415f35 --- /dev/null +++ b/api/0.22/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..990209c97 --- /dev/null +++ b/api/0.22/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..0ea64d052 --- /dev/null +++ b/api/0.22/index.html @@ -0,0 +1,651 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/api/0.22/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/api/0.22/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/api/0.22/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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..6a140e8ce --- /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:"Modules",url:"modules.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/modules.html b/api/0.22/modules.html new file mode 100644 index 000000000..6e4ef3786 --- /dev/null +++ b/api/0.22/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/api/0.22/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..e1c7e12e8 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/api/0.22/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/api/0.22/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.22/search/all_0.js b/api/0.22/search/all_0.js new file mode 100644 index 000000000..869f460ae --- /dev/null +++ b/api/0.22/search/all_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['api_20version_1',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.22/search/all_1.html b/api/0.22/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/api/0.22/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.22/search/all_1.js b/api/0.22/search/all_1.js new file mode 100644 index 000000000..204c38c05 --- /dev/null +++ b/api/0.22/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_2',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.22/search/all_2.html b/api/0.22/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/api/0.22/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.22/search/all_2.js b/api/0.22/search/all_2.js new file mode 100644 index 000000000..d6a623719 --- /dev/null +++ b/api/0.22/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_3',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.22/search/all_3.html b/api/0.22/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/api/0.22/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.22/search/all_3.js b/api/0.22/search/all_3.js new file mode 100644 index 000000000..e908022ab --- /dev/null +++ b/api/0.22/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_4',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_5',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.22/search/all_4.html b/api/0.22/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/api/0.22/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.22/search/all_4.js b/api/0.22/search/all_4.js new file mode 100644 index 000000000..6d0e67254 --- /dev/null +++ b/api/0.22/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_6',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.22/search/all_5.html b/api/0.22/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/api/0.22/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.22/search/all_5.js b/api/0.22/search/all_5.js new file mode 100644 index 000000000..4f4fb05a9 --- /dev/null +++ b/api/0.22/search/all_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_7',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.22/search/all_6.html b/api/0.22/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/api/0.22/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.22/search/all_6.js b/api/0.22/search/all_6.js new file mode 100644 index 000000000..5411ca92b --- /dev/null +++ b/api/0.22/search/all_6.js @@ -0,0 +1,109 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_14',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_15',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_16',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_17',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_18',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_19',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_20',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_21',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_22',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_23',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_24',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_25',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_26',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_27',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_28',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_29',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_30',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_31',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_32',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_33',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_34',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_35',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_36',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_37',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_38',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_39',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_40',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_41',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_42',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_43',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_44',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_45',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_46',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_47',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_48',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_49',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_50',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_51',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_52',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_53',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_54',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_55',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_56',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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_5fint64_60',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_61',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_62',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_63',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_64',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',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_5fbtls_5fproto_69',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_70',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_71',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_72',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_73',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_74',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_75',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_76',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_77',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_78',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_79',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_80',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_81',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_82',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_83',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_84',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_85',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_86',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_87',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_88',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_89',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_90',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_91',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_92',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_93',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_94',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_95',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_96',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_97',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_98',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_99',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_100',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_101',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_102',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_103',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_104',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_105',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_106',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_107',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_108',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_109',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_110',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_111',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_112',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_113',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.22/search/classes_0.html b/api/0.22/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/api/0.22/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.22/search/classes_0.js b/api/0.22/search/classes_0.js new file mode 100644 index 000000000..a2d7eb9fa --- /dev/null +++ b/api/0.22/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_114',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_115',['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..a933eea1a --- /dev/null +++ b/api/0.22/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/api/0.22/search/defines_0.html b/api/0.22/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/api/0.22/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.22/search/defines_0.js b/api/0.22/search/defines_0.js new file mode 100644 index 000000000..682d292bb --- /dev/null +++ b/api/0.22/search/defines_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_204',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_205',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_206',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_207',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_208',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_209',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_210',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_211',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_212',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_213',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_214',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_215',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_216',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_217',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.22/search/enums_0.html b/api/0.22/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/api/0.22/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.22/search/enums_0.js b/api/0.22/search/enums_0.js new file mode 100644 index 000000000..e8e5c3e00 --- /dev/null +++ b/api/0.22/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_199',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.22/search/enumvalues_0.html b/api/0.22/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/api/0.22/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.22/search/enumvalues_0.js b/api/0.22/search/enumvalues_0.js new file mode 100644 index 000000000..7f01c35ec --- /dev/null +++ b/api/0.22/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_200',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_201',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_202',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_203',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.22/search/files_0.html b/api/0.22/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/api/0.22/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.22/search/files_0.js b/api/0.22/search/files_0.js new file mode 100644 index 000000000..54752dab4 --- /dev/null +++ b/api/0.22/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_116',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_117',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_118',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_119',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_120',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_121',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_122',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/api/0.22/search/functions_0.html b/api/0.22/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/api/0.22/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.22/search/functions_0.js b/api/0.22/search/functions_0.js new file mode 100644 index 000000000..2a89bbc22 --- /dev/null +++ b/api/0.22/search/functions_0.js @@ -0,0 +1,72 @@ +var searchData= +[ + ['xcm_5faccept_123',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_124',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_125',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_126',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_127',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_128',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_129',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_130',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_131',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_132',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_133',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_134',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_135',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_136',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_137',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_138',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_139',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_140',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_141',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_142',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_143',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_144',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_145',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_146',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_147',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_148',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_149',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_150',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_151',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_152',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_153',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_154',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_155',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_156',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_157',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_158',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_159',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_160',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_161',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_162',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_163',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_164',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_165',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_166',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_167',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_168',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_169',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_170',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_171',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_172',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_173',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_174',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_175',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_176',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_177',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_178',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_179',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_180',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_181',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_182',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_183',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_184',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_185',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_186',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_187',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_188',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_189',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_190',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_191',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.22/search/groups_0.html b/api/0.22/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/api/0.22/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.22/search/groups_0.js b/api/0.22/search/groups_0.js new file mode 100644 index 000000000..6e8756088 --- /dev/null +++ b/api/0.22/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_218',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.22/search/groups_1.html b/api/0.22/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/api/0.22/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.22/search/groups_1.js b/api/0.22/search/groups_1.js new file mode 100644 index 000000000..b1f6ca015 --- /dev/null +++ b/api/0.22/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_219',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.22/search/mag_sel.svg b/api/0.22/search/mag_sel.svg new file mode 100644 index 000000000..03626f64a --- /dev/null +++ b/api/0.22/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/api/0.22/search/nomatches.html b/api/0.22/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/api/0.22/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/api/0.22/search/pages_0.html b/api/0.22/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/api/0.22/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.22/search/pages_0.js b/api/0.22/search/pages_0.js new file mode 100644 index 000000000..0a6228b41 --- /dev/null +++ b/api/0.22/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_220',['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..9074198f8 --- /dev/null +++ b/api/0.22/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/api/0.22/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.22/search/typedefs_0.js b/api/0.22/search/typedefs_0.js new file mode 100644 index 000000000..3c54eb8c2 --- /dev/null +++ b/api/0.22/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_197',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_198',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/api/0.22/search/variables_0.html b/api/0.22/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/api/0.22/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.22/search/variables_0.js b/api/0.22/search/variables_0.js new file mode 100644 index 000000000..a28fc1b94 --- /dev/null +++ b/api/0.22/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_192',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.22/search/variables_1.html b/api/0.22/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/api/0.22/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.22/search/variables_1.js b/api/0.22/search/variables_1.js new file mode 100644 index 000000000..824d8a8d5 --- /dev/null +++ b/api/0.22/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_193',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.22/search/variables_2.html b/api/0.22/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/api/0.22/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.22/search/variables_2.js b/api/0.22/search/variables_2.js new file mode 100644 index 000000000..cb99ba754 --- /dev/null +++ b/api/0.22/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_194',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_195',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.22/search/variables_3.html b/api/0.22/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/api/0.22/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.22/search/variables_3.js b/api/0.22/search/variables_3.js new file mode 100644 index 000000000..f9671eab9 --- /dev/null +++ b/api/0.22/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_196',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.22/server_accept.png b/api/0.22/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/api/0.22/server_accept.png differ diff --git a/api/0.22/splitbar.png b/api/0.22/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/api/0.22/splitbar.png differ diff --git a/api/0.22/structxcm__addr__host.html b/api/0.22/structxcm__addr__host.html new file mode 100644 index 000000000..8dc2b7491 --- /dev/null +++ b/api/0.22/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..91ac8da3a --- /dev/null +++ b/api/0.22/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/api/0.22/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/api/0.22/xcm_8h.html b/api/0.22/xcm_8h.html new file mode 100644 index 000000000..86ee8b021 --- /dev/null +++ b/api/0.22/xcm_8h.html @@ -0,0 +1,910 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..411edf9a5 --- /dev/null +++ b/api/0.22/xcm_8h_source.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1319 struct xcm_socket;
    +
    1320 
    +
    1373 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1374 
    +
    1396 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1397  const struct xcm_attr_map *attrs);
    +
    1398 
    +
    1434 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1435 
    +
    1451 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1452  const struct xcm_attr_map *attrs);
    +
    1453 
    +
    1470 int xcm_close(struct xcm_socket *socket);
    +
    1471 
    +
    1491 void xcm_cleanup(struct xcm_socket *socket);
    +
    1492 
    +
    1511 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1512 
    +
    1532 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1533  const struct xcm_attr_map *attrs);
    +
    1534 
    +
    1557 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1558 
    +
    1582 int 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 
    +
    1653 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1654 
    +
    1702 int xcm_fd(struct xcm_socket *socket);
    +
    1703 
    +
    1749 int xcm_finish(struct xcm_socket *socket);
    +
    1750 
    +
    1791 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1792 
    +
    1807 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1808 
    +
    1825 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1826 
    +
    1841 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..5b9d30047 --- /dev/null +++ b/api/0.22/xcm__addr_8h.html @@ -0,0 +1,1070 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..6374cb629 --- /dev/null +++ b/api/0.22/xcm__addr_8h_source.html @@ -0,0 +1,199 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    44 enum 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];
    +
    63  } addr;
    +
    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 
    +
    93 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94 
    +
    108 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109  uint16_t *port);
    +
    110 
    +
    124 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125  uint16_t *port);
    +
    126 
    +
    141 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142  uint16_t *port);
    +
    143 
    +
    158 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159  uint16_t *port);
    +
    160 
    +
    174 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175 
    +
    189 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190  size_t capacity);
    +
    191 
    +
    205 int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206  uint16_t *port);
    +
    207 
    +
    223 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224  char *utls_addr_s, size_t capacity);
    +
    225 
    +
    241 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242  char *tls_addr_s, size_t capacity);
    +
    243 
    +
    259 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260  char *tcp_addr_s, size_t capacity);
    +
    261 
    +
    277 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278  char *sctp_addr_s, size_t capacity);
    +
    279 
    +
    294 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295 
    +
    310 int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311 
    +
    327 int 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..b32f1f8ce --- /dev/null +++ b/api/0.22/xcm__attr_8h.html @@ -0,0 +1,674 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..cb1968a11 --- /dev/null +++ b/api/0.22/xcm__attr_8h_source.html @@ -0,0 +1,143 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89  const char *value);
    +
    90 
    +
    116 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118 
    +
    135 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136  bool *value);
    +
    137 
    +
    154 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155  int64_t *value);
    +
    156 
    +
    175 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176  char *value, size_t capacity);
    +
    177 
    +
    195 int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    196  void *value, size_t capacity);
    +
    197 
    +
    199 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    200  void *value, size_t value_len, void *cb_data);
    +
    201 
    +
    215 void 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..6939528b9 --- /dev/null +++ b/api/0.22/xcm__attr__map_8h.html @@ -0,0 +1,898 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..24513b769 --- /dev/null +++ b/api/0.22/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) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    22 #include <xcm_attr_types.h>
    +
    23 
    +
    24 #include <stdbool.h>
    +
    25 #include <stddef.h>
    +
    26 #include <stdint.h>
    +
    27 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name, bool attr_value);
    +
    81 
    +
    82 
    +
    92 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    93  const char *attr_name, int64_t attr_value);
    +
    94 
    +
    95 
    +
    105 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    106  const char *attr_name, const char *attr_value);
    +
    107 
    +
    108 
    +
    118 void 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 
    +
    132 void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    133  const struct xcm_attr_map *src_map);
    +
    134 
    +
    135 
    +
    152 const 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 
    +
    172 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    173  const char *attr_name);
    +
    174 
    +
    175 
    +
    190 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    191  const char *attr_name);
    +
    192 
    +
    193 
    +
    208 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    209  const char *attr_name);
    +
    210 
    +
    225 const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    226  const char *attr_name);
    +
    227 
    +
    236 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    237  const char *attr_name);
    +
    238 
    +
    239 
    +
    248 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    249 
    +
    250 
    +
    258 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    259 
    +
    260 
    +
    264 typedef 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 
    +
    283 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    284  xcm_attr_map_foreach_cb cb, void *user);
    +
    285 
    +
    286 
    +
    295 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    296  const struct xcm_attr_map *attr_map_b);
    +
    297 
    +
    306 void 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)
    +
    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)
    +
    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_bin(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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..1964f2fd4 --- /dev/null +++ b/api/0.22/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..98a9929e6 --- /dev/null +++ b/api/0.22/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..a94cfc2c0 --- /dev/null +++ b/api/0.22/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..6c0f3b41b --- /dev/null +++ b/api/0.22/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..aecbce44f --- /dev/null +++ b/api/0.22/xcm__version_8h.html @@ -0,0 +1,266 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..ba737519e --- /dev/null +++ b/api/0.22/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    59 unsigned int xcm_version_major(void);
    +
    60 
    +
    67 unsigned int xcm_version_minor(void);
    +
    68 
    +
    74 unsigned int xcm_version_patch(void);
    +
    75 
    +
    84 const char *xcm_version(void);
    +
    85 
    +
    91 unsigned int xcm_version_api_major(void);
    +
    92 
    +
    98 unsigned int xcm_version_api_minor(void);
    +
    99 
    +
    108 const char *xcm_version_api(void);
    +
    109 
    +
    110 #ifdef __cplusplus
    +
    111 }
    +
    112 #endif
    +
    113 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..51dd1acda --- /dev/null +++ b/api/0.23/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/api/0.23/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/api/0.23/bdwn.png differ diff --git a/api/0.23/classes.html b/api/0.23/classes.html new file mode 100644 index 000000000..9ca6c1cec --- /dev/null +++ b/api/0.23/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..7135a4163 --- /dev/null +++ b/api/0.23/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,103 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    file  xcm_version.h [code]
     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.png b/api/0.23/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/api/0.23/doc.png differ diff --git a/api/0.23/doxygen.css b/api/0.23/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/api/0.23/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/api/0.23/doxygen.svg b/api/0.23/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/api/0.23/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.23/dynsections.js b/api/0.23/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/api/0.23/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/api/0.23/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/api/0.23/folderclosed.png differ diff --git a/api/0.23/folderopen.png b/api/0.23/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/api/0.23/folderopen.png differ diff --git a/api/0.23/functions.html b/api/0.23/functions.html new file mode 100644 index 000000000..7de75f989 --- /dev/null +++ b/api/0.23/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..9652f1ad5 --- /dev/null +++ b/api/0.23/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.23/globals.html b/api/0.23/globals.html new file mode 100644 index 000000000..3a1099624 --- /dev/null +++ b/api/0.23/globals.html @@ -0,0 +1,380 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..e54096ab7 --- /dev/null +++ b/api/0.23/globals_defs.html @@ -0,0 +1,135 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.23/globals_enum.html b/api/0.23/globals_enum.html new file mode 100644 index 000000000..01cd94680 --- /dev/null +++ b/api/0.23/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.23/globals_eval.html b/api/0.23/globals_eval.html new file mode 100644 index 000000000..ee0209ca3 --- /dev/null +++ b/api/0.23/globals_eval.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.23/globals_func.html b/api/0.23/globals_func.html new file mode 100644 index 000000000..68b080051 --- /dev/null +++ b/api/0.23/globals_func.html @@ -0,0 +1,293 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - x -

    +
    + + + + diff --git a/api/0.23/globals_type.html b/api/0.23/globals_type.html new file mode 100644 index 000000000..20ead71bd --- /dev/null +++ b/api/0.23/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.23/group__api__version.html b/api/0.23/group__api__version.html new file mode 100644 index 000000000..87cf1c096 --- /dev/null +++ b/api/0.23/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..0f6defa21 --- /dev/null +++ b/api/0.23/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..189219ecc --- /dev/null +++ b/api/0.23/index.html @@ -0,0 +1,653 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/api/0.23/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/api/0.23/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/api/0.23/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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..6a140e8ce --- /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:"Modules",url:"modules.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/modules.html b/api/0.23/modules.html new file mode 100644 index 000000000..5063f0e14 --- /dev/null +++ b/api/0.23/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/api/0.23/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..e1c7e12e8 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/api/0.23/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/api/0.23/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.23/search/all_0.js b/api/0.23/search/all_0.js new file mode 100644 index 000000000..869f460ae --- /dev/null +++ b/api/0.23/search/all_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['api_20version_1',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.23/search/all_1.html b/api/0.23/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/api/0.23/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.23/search/all_1.js b/api/0.23/search/all_1.js new file mode 100644 index 000000000..204c38c05 --- /dev/null +++ b/api/0.23/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_2',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.23/search/all_2.html b/api/0.23/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/api/0.23/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.23/search/all_2.js b/api/0.23/search/all_2.js new file mode 100644 index 000000000..d6a623719 --- /dev/null +++ b/api/0.23/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_3',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.23/search/all_3.html b/api/0.23/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/api/0.23/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.23/search/all_3.js b/api/0.23/search/all_3.js new file mode 100644 index 000000000..e908022ab --- /dev/null +++ b/api/0.23/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_4',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_5',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.23/search/all_4.html b/api/0.23/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/api/0.23/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.23/search/all_4.js b/api/0.23/search/all_4.js new file mode 100644 index 000000000..6d0e67254 --- /dev/null +++ b/api/0.23/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_6',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.23/search/all_5.html b/api/0.23/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/api/0.23/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.23/search/all_5.js b/api/0.23/search/all_5.js new file mode 100644 index 000000000..4f4fb05a9 --- /dev/null +++ b/api/0.23/search/all_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_7',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.23/search/all_6.html b/api/0.23/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/api/0.23/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.23/search/all_6.js b/api/0.23/search/all_6.js new file mode 100644 index 000000000..ce7988914 --- /dev/null +++ b/api/0.23/search/all_6.js @@ -0,0 +1,114 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_14',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_15',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_16',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_17',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_18',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_19',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_20',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_21',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_22',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_23',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_24',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_25',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_26',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_27',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_28',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_29',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_30',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_31',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_32',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_33',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_34',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_35',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_36',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_37',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_38',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_39',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_40',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_41',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_42',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_43',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_44',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_45',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_46',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_47',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_48',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_49',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_50',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_51',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_52',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_53',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_54',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_55',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_56',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_57',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_58',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_59',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_60',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_61',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_62',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_63',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_64',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_65',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_66',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_67',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_68',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_69',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_70',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_71',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_72',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_73',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_74',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_75',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_76',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_77',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_78',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_79',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_80',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_81',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_82',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_83',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_84',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_85',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_86',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_87',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_88',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_89',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_90',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_91',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_92',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_93',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_94',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_95',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_96',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_97',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_98',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_99',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_100',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_101',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_102',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_103',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_104',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_105',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_106',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_107',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_108',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_109',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_110',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_111',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_112',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_113',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_114',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_115',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_116',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_117',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_118',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.23/search/classes_0.html b/api/0.23/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/api/0.23/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.23/search/classes_0.js b/api/0.23/search/classes_0.js new file mode 100644 index 000000000..b172d81d9 --- /dev/null +++ b/api/0.23/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_119',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_120',['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..a933eea1a --- /dev/null +++ b/api/0.23/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/api/0.23/search/defines_0.html b/api/0.23/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/api/0.23/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.23/search/defines_0.js b/api/0.23/search/defines_0.js new file mode 100644 index 000000000..b386e5aea --- /dev/null +++ b/api/0.23/search/defines_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_214',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_215',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_216',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_217',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_218',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_219',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_220',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_221',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_222',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_223',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_224',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_225',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_226',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_227',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.23/search/enums_0.html b/api/0.23/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/api/0.23/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.23/search/enums_0.js b/api/0.23/search/enums_0.js new file mode 100644 index 000000000..46569d8f3 --- /dev/null +++ b/api/0.23/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_208',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.23/search/enumvalues_0.html b/api/0.23/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/api/0.23/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.23/search/enumvalues_0.js b/api/0.23/search/enumvalues_0.js new file mode 100644 index 000000000..d844bf500 --- /dev/null +++ b/api/0.23/search/enumvalues_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_209',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_210',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_211',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_212',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_213',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.23/search/files_0.html b/api/0.23/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/api/0.23/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.23/search/files_0.js b/api/0.23/search/files_0.js new file mode 100644 index 000000000..b900f058d --- /dev/null +++ b/api/0.23/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_121',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_122',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_123',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_124',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_125',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_126',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_127',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/api/0.23/search/functions_0.html b/api/0.23/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/api/0.23/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.23/search/functions_0.js b/api/0.23/search/functions_0.js new file mode 100644 index 000000000..70ba8daff --- /dev/null +++ b/api/0.23/search/functions_0.js @@ -0,0 +1,76 @@ +var searchData= +[ + ['xcm_5faccept_128',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_129',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_130',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_131',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_132',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_133',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_134',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_135',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_136',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_137',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_138',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_139',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_140',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_141',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_142',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_143',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_144',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_145',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_146',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_147',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_148',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_149',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_150',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_151',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_152',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_153',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_154',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_155',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_156',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_157',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_158',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_159',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_160',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_161',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_162',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_163',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_164',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_165',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_166',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_167',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_168',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_169',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_170',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_171',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_172',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_173',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_174',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_175',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_176',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_177',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_178',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_179',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_180',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_181',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_182',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_183',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_184',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_185',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_186',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_187',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_188',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_189',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_190',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_191',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_192',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_193',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_194',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_195',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_196',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_197',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_198',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_199',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_200',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.23/search/groups_0.html b/api/0.23/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/api/0.23/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.23/search/groups_0.js b/api/0.23/search/groups_0.js new file mode 100644 index 000000000..b6844392a --- /dev/null +++ b/api/0.23/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_228',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.23/search/groups_1.html b/api/0.23/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/api/0.23/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.23/search/groups_1.js b/api/0.23/search/groups_1.js new file mode 100644 index 000000000..b6aba910c --- /dev/null +++ b/api/0.23/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_229',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.23/search/mag_sel.svg b/api/0.23/search/mag_sel.svg new file mode 100644 index 000000000..03626f64a --- /dev/null +++ b/api/0.23/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/api/0.23/search/nomatches.html b/api/0.23/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/api/0.23/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/api/0.23/search/pages_0.html b/api/0.23/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/api/0.23/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.23/search/pages_0.js b/api/0.23/search/pages_0.js new file mode 100644 index 000000000..76d723197 --- /dev/null +++ b/api/0.23/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_230',['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..9074198f8 --- /dev/null +++ b/api/0.23/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/api/0.23/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.23/search/typedefs_0.js b/api/0.23/search/typedefs_0.js new file mode 100644 index 000000000..5eb8aeb26 --- /dev/null +++ b/api/0.23/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_206',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_207',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/api/0.23/search/variables_0.html b/api/0.23/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/api/0.23/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.23/search/variables_0.js b/api/0.23/search/variables_0.js new file mode 100644 index 000000000..a54af1600 --- /dev/null +++ b/api/0.23/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_201',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.23/search/variables_1.html b/api/0.23/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/api/0.23/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.23/search/variables_1.js b/api/0.23/search/variables_1.js new file mode 100644 index 000000000..739e85e12 --- /dev/null +++ b/api/0.23/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_202',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.23/search/variables_2.html b/api/0.23/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/api/0.23/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.23/search/variables_2.js b/api/0.23/search/variables_2.js new file mode 100644 index 000000000..1820b3914 --- /dev/null +++ b/api/0.23/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_203',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_204',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.23/search/variables_3.html b/api/0.23/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/api/0.23/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.23/search/variables_3.js b/api/0.23/search/variables_3.js new file mode 100644 index 000000000..6b502f044 --- /dev/null +++ b/api/0.23/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_205',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.23/server_accept.png b/api/0.23/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/api/0.23/server_accept.png differ diff --git a/api/0.23/splitbar.png b/api/0.23/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/api/0.23/splitbar.png differ diff --git a/api/0.23/structxcm__addr__host.html b/api/0.23/structxcm__addr__host.html new file mode 100644 index 000000000..b277a3135 --- /dev/null +++ b/api/0.23/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..d734184ca --- /dev/null +++ b/api/0.23/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/api/0.23/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/api/0.23/xcm_8h.html b/api/0.23/xcm_8h.html new file mode 100644 index 000000000..127c917ca --- /dev/null +++ b/api/0.23/xcm_8h.html @@ -0,0 +1,910 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..adf9075f6 --- /dev/null +++ b/api/0.23/xcm_8h_source.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1321 struct xcm_socket;
    +
    1322 
    +
    1375 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1376 
    +
    1398 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1399  const struct xcm_attr_map *attrs);
    +
    1400 
    +
    1436 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1437 
    +
    1453 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1454  const struct xcm_attr_map *attrs);
    +
    1455 
    +
    1472 int xcm_close(struct xcm_socket *socket);
    +
    1473 
    +
    1493 void xcm_cleanup(struct xcm_socket *socket);
    +
    1494 
    +
    1513 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1514 
    +
    1534 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1535  const struct xcm_attr_map *attrs);
    +
    1536 
    +
    1559 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1560 
    +
    1584 int 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 
    +
    1655 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1656 
    +
    1704 int xcm_fd(struct xcm_socket *socket);
    +
    1705 
    +
    1751 int xcm_finish(struct xcm_socket *socket);
    +
    1752 
    +
    1793 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1794 
    +
    1809 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1810 
    +
    1827 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1828 
    +
    1843 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..6eee0052a --- /dev/null +++ b/api/0.23/xcm__addr_8h.html @@ -0,0 +1,1070 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..804e7425c --- /dev/null +++ b/api/0.23/xcm__addr_8h_source.html @@ -0,0 +1,199 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    44 enum 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];
    +
    63  } addr;
    +
    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 
    +
    93 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94 
    +
    108 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109  uint16_t *port);
    +
    110 
    +
    124 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125  uint16_t *port);
    +
    126 
    +
    141 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142  uint16_t *port);
    +
    143 
    +
    158 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159  uint16_t *port);
    +
    160 
    +
    174 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175 
    +
    189 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190  size_t capacity);
    +
    191 
    +
    205 int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206  uint16_t *port);
    +
    207 
    +
    223 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224  char *utls_addr_s, size_t capacity);
    +
    225 
    +
    241 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242  char *tls_addr_s, size_t capacity);
    +
    243 
    +
    259 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260  char *tcp_addr_s, size_t capacity);
    +
    261 
    +
    277 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278  char *sctp_addr_s, size_t capacity);
    +
    279 
    +
    294 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295 
    +
    310 int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311 
    +
    327 int 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..2cd3fbcbf --- /dev/null +++ b/api/0.23/xcm__attr_8h.html @@ -0,0 +1,774 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..31b23a2a1 --- /dev/null +++ b/api/0.23/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) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_double(struct xcm_socket *socket, const char *name,
    +
    89  double value);
    +
    90 
    +
    103 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    104  const char *value);
    +
    105 
    +
    131 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    132  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    133 
    +
    150 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    151  bool *value);
    +
    152 
    +
    169 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    170  int64_t *value);
    +
    171 
    +
    188 int xcm_attr_get_double(struct xcm_socket *socket, const char *name,
    +
    189  double *value);
    +
    190 
    +
    209 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    210  char *value, size_t capacity);
    +
    211 
    +
    229 int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    230  void *value, size_t capacity);
    +
    231 
    +
    233 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    234  void *value, size_t value_len, void *cb_data);
    +
    235 
    +
    249 void 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..8fe5177f5 --- /dev/null +++ b/api/0.23/xcm__attr__map_8h.html @@ -0,0 +1,985 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..911738721 --- /dev/null +++ b/api/0.23/xcm__attr__map_8h_source.html @@ -0,0 +1,211 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    23 #include <xcm_attr_types.h>
    +
    24 
    +
    25 #include <stdbool.h>
    +
    26 #include <stddef.h>
    +
    27 #include <stdint.h>
    +
    28 
    +
    29 struct xcm_attr_map;
    +
    30 
    +
    31 
    +
    37 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38 
    +
    39 
    +
    47 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48 
    +
    66 void 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 
    +
    80 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81  const char *attr_name, bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name, int64_t attr_value);
    +
    95 
    +
    96 
    +
    106 void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107  const char *attr_name, double attr_value);
    +
    108 
    +
    109 
    +
    119 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120  const char *attr_name, const char *attr_value);
    +
    121 
    +
    122 
    +
    132 void 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 
    +
    146 void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147  const struct xcm_attr_map *src_map);
    +
    148 
    +
    149 
    +
    166 const 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 
    +
    186 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187  const char *attr_name);
    +
    188 
    +
    189 
    +
    204 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205  const char *attr_name);
    +
    206 
    +
    207 
    +
    222 const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223  const char *attr_name);
    +
    224 
    +
    225 
    +
    240 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241  const char *attr_name);
    +
    242 
    +
    257 const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258  const char *attr_name);
    +
    259 
    +
    268 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269  const char *attr_name);
    +
    270 
    +
    271 
    +
    280 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281 
    +
    282 
    +
    290 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291 
    +
    292 
    +
    296 typedef 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 
    +
    315 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316  xcm_attr_map_foreach_cb cb, void *user);
    +
    317 
    +
    318 
    +
    327 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328  const struct xcm_attr_map *attr_map_b);
    +
    329 
    +
    338 void 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)
    +
    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)
    +
    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_bin(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)
    +
    const int64_t * xcm_attr_map_get_int64(const 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..e241cf74b --- /dev/null +++ b/api/0.23/xcm__attr__types_8h.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..c2c53bd45 --- /dev/null +++ b/api/0.23/xcm__attr__types_8h_source.html @@ -0,0 +1,107 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + + +
    30 };
    +
    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..f59c1af46 --- /dev/null +++ b/api/0.23/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..ea92fcf3d --- /dev/null +++ b/api/0.23/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..65cf2ba62 --- /dev/null +++ b/api/0.23/xcm__version_8h.html @@ -0,0 +1,266 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..7d12f59f2 --- /dev/null +++ b/api/0.23/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    59 unsigned int xcm_version_major(void);
    +
    60 
    +
    67 unsigned int xcm_version_minor(void);
    +
    68 
    +
    74 unsigned int xcm_version_patch(void);
    +
    75 
    +
    84 const char *xcm_version(void);
    +
    85 
    +
    91 unsigned int xcm_version_api_major(void);
    +
    92 
    +
    98 unsigned int xcm_version_api_minor(void);
    +
    99 
    +
    108 const char *xcm_version_api(void);
    +
    109 
    +
    110 #ifdef __cplusplus
    +
    111 }
    +
    112 #endif
    +
    113 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..bc32d66b0 --- /dev/null +++ b/api/0.24/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/api/0.24/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/api/0.24/bdwn.png differ diff --git a/api/0.24/classes.html b/api/0.24/classes.html new file mode 100644 index 000000000..8e74d4277 --- /dev/null +++ b/api/0.24/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..8a87018d2 --- /dev/null +++ b/api/0.24/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,103 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    file  xcm_version.h [code]
     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.png b/api/0.24/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/api/0.24/doc.png differ diff --git a/api/0.24/doxygen.css b/api/0.24/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/api/0.24/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/api/0.24/doxygen.svg b/api/0.24/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/api/0.24/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.24/dynsections.js b/api/0.24/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/api/0.24/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/api/0.24/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/api/0.24/folderclosed.png differ diff --git a/api/0.24/folderopen.png b/api/0.24/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/api/0.24/folderopen.png differ diff --git a/api/0.24/functions.html b/api/0.24/functions.html new file mode 100644 index 000000000..0e40afbc2 --- /dev/null +++ b/api/0.24/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..5520724ad --- /dev/null +++ b/api/0.24/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.24/globals.html b/api/0.24/globals.html new file mode 100644 index 000000000..0e70ad573 --- /dev/null +++ b/api/0.24/globals.html @@ -0,0 +1,389 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..efeff084a --- /dev/null +++ b/api/0.24/globals_defs.html @@ -0,0 +1,138 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.24/globals_enum.html b/api/0.24/globals_enum.html new file mode 100644 index 000000000..1887b6815 --- /dev/null +++ b/api/0.24/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.24/globals_eval.html b/api/0.24/globals_eval.html new file mode 100644 index 000000000..03202d81c --- /dev/null +++ b/api/0.24/globals_eval.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.24/globals_func.html b/api/0.24/globals_func.html new file mode 100644 index 000000000..9f45c254e --- /dev/null +++ b/api/0.24/globals_func.html @@ -0,0 +1,299 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - x -

    +
    + + + + diff --git a/api/0.24/globals_type.html b/api/0.24/globals_type.html new file mode 100644 index 000000000..c2c3754e5 --- /dev/null +++ b/api/0.24/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.24/group__api__version.html b/api/0.24/group__api__version.html new file mode 100644 index 000000000..c698af5d2 --- /dev/null +++ b/api/0.24/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..2c07db5bc --- /dev/null +++ b/api/0.24/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..e2f711cc0 --- /dev/null +++ b/api/0.24/index.html @@ -0,0 +1,711 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/api/0.24/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/api/0.24/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/api/0.24/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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..6a140e8ce --- /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:"Modules",url:"modules.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/modules.html b/api/0.24/modules.html new file mode 100644 index 000000000..26fc6d8ef --- /dev/null +++ b/api/0.24/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/api/0.24/nb_connect_and_send.png new file mode 100644 index 000000000..2bfaec2e1 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..4ce56aa7b 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..b29bdce34 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/api/0.24/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/api/0.24/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.24/search/all_0.js b/api/0.24/search/all_0.js new file mode 100644 index 000000000..869f460ae --- /dev/null +++ b/api/0.24/search/all_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['api_20version_1',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.24/search/all_1.html b/api/0.24/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/api/0.24/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.24/search/all_1.js b/api/0.24/search/all_1.js new file mode 100644 index 000000000..204c38c05 --- /dev/null +++ b/api/0.24/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_2',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.24/search/all_2.html b/api/0.24/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/api/0.24/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.24/search/all_2.js b/api/0.24/search/all_2.js new file mode 100644 index 000000000..d6a623719 --- /dev/null +++ b/api/0.24/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_3',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.24/search/all_3.html b/api/0.24/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/api/0.24/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.24/search/all_3.js b/api/0.24/search/all_3.js new file mode 100644 index 000000000..e908022ab --- /dev/null +++ b/api/0.24/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_4',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_5',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.24/search/all_4.html b/api/0.24/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/api/0.24/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.24/search/all_4.js b/api/0.24/search/all_4.js new file mode 100644 index 000000000..6d0e67254 --- /dev/null +++ b/api/0.24/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_6',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.24/search/all_5.html b/api/0.24/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/api/0.24/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.24/search/all_5.js b/api/0.24/search/all_5.js new file mode 100644 index 000000000..4f4fb05a9 --- /dev/null +++ b/api/0.24/search/all_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_7',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.24/search/all_6.html b/api/0.24/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/api/0.24/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.24/search/all_6.js b/api/0.24/search/all_6.js new file mode 100644 index 000000000..6f8a0941a --- /dev/null +++ b/api/0.24/search/all_6.js @@ -0,0 +1,117 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtcp_14',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_15',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_16',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_17',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_18',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_19',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_20',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_21',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_22',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_23',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_24',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_25',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_26',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_27',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_28',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_29',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_30',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_31',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_32',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_33',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_34',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_35',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_36',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_37',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_38',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_39',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_40',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_41',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_42',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_43',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_44',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_45',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_46',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_47',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_48',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_49',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_50',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_51',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_52',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_53',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_54',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_55',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_56',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_57',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_58',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_59',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_60',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_61',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_62',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_63',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_64',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_65',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_66',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_67',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_68',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_69',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_70',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_71',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_72',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_73',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_74',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_75',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtcp_5fproto_76',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_77',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_78',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_79',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_80',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_81',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_82',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_83',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_84',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_85',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_86',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_87',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_88',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_89',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_90',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_91',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_92',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_93',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_94',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_95',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_96',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_97',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_98',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_99',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_100',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_101',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_102',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_103',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_104',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_105',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_106',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_107',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_108',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_109',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_110',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_111',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_112',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_113',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_114',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_115',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_116',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_117',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_118',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_119',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_120',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_121',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.24/search/classes_0.html b/api/0.24/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/api/0.24/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.24/search/classes_0.js b/api/0.24/search/classes_0.js new file mode 100644 index 000000000..46c72b27b --- /dev/null +++ b/api/0.24/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_122',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_123',['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..a933eea1a --- /dev/null +++ b/api/0.24/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/api/0.24/search/defines_0.html b/api/0.24/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/api/0.24/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.24/search/defines_0.js b/api/0.24/search/defines_0.js new file mode 100644 index 000000000..389129bd6 --- /dev/null +++ b/api/0.24/search/defines_0.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['xcm_5fbtcp_5fproto_219',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_220',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_221',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_222',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_223',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_224',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_225',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_226',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_227',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_228',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_229',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_230',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_231',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_232',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_233',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.24/search/enums_0.html b/api/0.24/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/api/0.24/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.24/search/enums_0.js b/api/0.24/search/enums_0.js new file mode 100644 index 000000000..03d67d05f --- /dev/null +++ b/api/0.24/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_213',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.24/search/enumvalues_0.html b/api/0.24/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/api/0.24/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.24/search/enumvalues_0.js b/api/0.24/search/enumvalues_0.js new file mode 100644 index 000000000..53a864a29 --- /dev/null +++ b/api/0.24/search/enumvalues_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_214',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_215',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_216',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_217',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_218',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.24/search/files_0.html b/api/0.24/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/api/0.24/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.24/search/files_0.js b/api/0.24/search/files_0.js new file mode 100644 index 000000000..339f551ed --- /dev/null +++ b/api/0.24/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_124',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_125',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_126',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_127',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_128',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_129',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_130',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/api/0.24/search/functions_0.html b/api/0.24/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/api/0.24/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.24/search/functions_0.js b/api/0.24/search/functions_0.js new file mode 100644 index 000000000..5e38d5ab8 --- /dev/null +++ b/api/0.24/search/functions_0.js @@ -0,0 +1,78 @@ +var searchData= +[ + ['xcm_5faccept_131',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_132',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtcp_133',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_134',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_135',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_136',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_137',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_138',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_139',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_140',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_141',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_142',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_143',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_144',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_145',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_146',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_147',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_148',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_149',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_150',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_151',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_152',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_153',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_154',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_155',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_156',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_157',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_158',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_159',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_160',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_161',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_162',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_163',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_164',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_165',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_166',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_167',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_168',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_169',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_170',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_171',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_172',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_173',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_174',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_175',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_176',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_177',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_178',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_179',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_180',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_181',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_182',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_183',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_184',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_185',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_186',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_187',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_188',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_189',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_190',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_191',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_192',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_193',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_194',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_195',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_196',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_197',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_198',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_199',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_200',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_201',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_202',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_203',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_204',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_205',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.24/search/groups_0.html b/api/0.24/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/api/0.24/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.24/search/groups_0.js b/api/0.24/search/groups_0.js new file mode 100644 index 000000000..7c795c8d6 --- /dev/null +++ b/api/0.24/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_234',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.24/search/groups_1.html b/api/0.24/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/api/0.24/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.24/search/groups_1.js b/api/0.24/search/groups_1.js new file mode 100644 index 000000000..bdfe1de90 --- /dev/null +++ b/api/0.24/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_235',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.24/search/mag_sel.svg b/api/0.24/search/mag_sel.svg new file mode 100644 index 000000000..03626f64a --- /dev/null +++ b/api/0.24/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/api/0.24/search/nomatches.html b/api/0.24/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/api/0.24/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/api/0.24/search/pages_0.html b/api/0.24/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/api/0.24/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.24/search/pages_0.js b/api/0.24/search/pages_0.js new file mode 100644 index 000000000..04b117677 --- /dev/null +++ b/api/0.24/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_236',['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..9074198f8 --- /dev/null +++ b/api/0.24/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/api/0.24/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.24/search/typedefs_0.js b/api/0.24/search/typedefs_0.js new file mode 100644 index 000000000..448720ea0 --- /dev/null +++ b/api/0.24/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_211',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_212',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/api/0.24/search/variables_0.html b/api/0.24/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/api/0.24/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.24/search/variables_0.js b/api/0.24/search/variables_0.js new file mode 100644 index 000000000..7b6435276 --- /dev/null +++ b/api/0.24/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_206',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.24/search/variables_1.html b/api/0.24/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/api/0.24/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.24/search/variables_1.js b/api/0.24/search/variables_1.js new file mode 100644 index 000000000..bf7bf9f9e --- /dev/null +++ b/api/0.24/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_207',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.24/search/variables_2.html b/api/0.24/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/api/0.24/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.24/search/variables_2.js b/api/0.24/search/variables_2.js new file mode 100644 index 000000000..08ecaf1cb --- /dev/null +++ b/api/0.24/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_208',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_209',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.24/search/variables_3.html b/api/0.24/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/api/0.24/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.24/search/variables_3.js b/api/0.24/search/variables_3.js new file mode 100644 index 000000000..df64ea794 --- /dev/null +++ b/api/0.24/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_210',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.24/server_accept.png b/api/0.24/server_accept.png new file mode 100644 index 000000000..f1ae8ad49 Binary files /dev/null and b/api/0.24/server_accept.png differ diff --git a/api/0.24/splitbar.png b/api/0.24/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/api/0.24/splitbar.png differ diff --git a/api/0.24/structxcm__addr__host.html b/api/0.24/structxcm__addr__host.html new file mode 100644 index 000000000..cf47b2e3e --- /dev/null +++ b/api/0.24/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..64de59981 --- /dev/null +++ b/api/0.24/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/api/0.24/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/api/0.24/xcm_8h.html b/api/0.24/xcm_8h.html new file mode 100644 index 000000000..723746252 --- /dev/null +++ b/api/0.24/xcm_8h.html @@ -0,0 +1,910 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..197449149 --- /dev/null +++ b/api/0.24/xcm_8h_source.html @@ -0,0 +1,167 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1465 struct xcm_socket;
    +
    1466 
    +
    1519 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1520 
    +
    1542 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1543  const struct xcm_attr_map *attrs);
    +
    1544 
    +
    1580 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1581 
    +
    1597 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1598  const struct xcm_attr_map *attrs);
    +
    1599 
    +
    1616 int xcm_close(struct xcm_socket *socket);
    +
    1617 
    +
    1637 void xcm_cleanup(struct xcm_socket *socket);
    +
    1638 
    +
    1657 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1658 
    +
    1678 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1679  const struct xcm_attr_map *attrs);
    +
    1680 
    +
    1703 int xcm_send(struct xcm_socket *__restrict conn_socket,
    +
    1704  const void *__restrict buf, size_t len);
    +
    1705 
    +
    1729 int 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 
    +
    1801 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1802 
    +
    1850 int xcm_fd(struct xcm_socket *socket);
    +
    1851 
    +
    1897 int xcm_finish(struct xcm_socket *socket);
    +
    1898 
    +
    1939 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1940 
    +
    1955 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1956 
    +
    1973 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1974 
    +
    1989 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    int xcm_receive(struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    int xcm_send(struct xcm_socket *__restrict conn_socket, const void *__restrict 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_server_a(const char *local_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.24/xcm__addr_8h.html b/api/0.24/xcm__addr_8h.html new file mode 100644 index 000000000..22749c90f --- /dev/null +++ b/api/0.24/xcm__addr_8h.html @@ -0,0 +1,1200 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..42086067e --- /dev/null +++ b/api/0.24/xcm__addr_8h_source.html @@ -0,0 +1,208 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    46 enum 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];
    +
    65  } addr;
    +
    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 
    +
    95 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    96 
    +
    110 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    111  uint16_t *port);
    +
    112 
    +
    126 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    127  uint16_t *port);
    +
    128 
    +
    143 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    144  uint16_t *port);
    +
    145 
    +
    160 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    161  uint16_t *port);
    +
    162 
    +
    176 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    177 
    +
    191 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    192  size_t capacity);
    +
    193 
    +
    207 int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host,
    +
    208  uint16_t *port);
    +
    209 
    +
    223 int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    224  uint16_t *port);
    +
    225 
    +
    241 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    242  char *utls_addr_s, size_t capacity);
    +
    243 
    +
    259 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    260  char *tls_addr_s, size_t capacity);
    +
    261 
    +
    277 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    278  char *tcp_addr_s, size_t capacity);
    +
    279 
    +
    295 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    296  char *sctp_addr_s, size_t capacity);
    +
    297 
    +
    312 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    313 
    +
    328 int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    329 
    +
    345 int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port,
    +
    346  char *btcp_addr_s, size_t capacity);
    +
    347 
    +
    363 int 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..d5bed1193 --- /dev/null +++ b/api/0.24/xcm__attr_8h.html @@ -0,0 +1,774 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..a1ca5636b --- /dev/null +++ b/api/0.24/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) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_double(struct xcm_socket *socket, const char *name,
    +
    89  double value);
    +
    90 
    +
    103 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    104  const char *value);
    +
    105 
    +
    131 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    132  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    133 
    +
    150 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    151  bool *value);
    +
    152 
    +
    169 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    170  int64_t *value);
    +
    171 
    +
    188 int xcm_attr_get_double(struct xcm_socket *socket, const char *name,
    +
    189  double *value);
    +
    190 
    +
    209 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    210  char *value, size_t capacity);
    +
    211 
    +
    229 int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    230  void *value, size_t capacity);
    +
    231 
    +
    233 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    234  void *value, size_t value_len, void *cb_data);
    +
    235 
    +
    249 void 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..dae768264 --- /dev/null +++ b/api/0.24/xcm__attr__map_8h.html @@ -0,0 +1,985 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..e1ed6755d --- /dev/null +++ b/api/0.24/xcm__attr__map_8h_source.html @@ -0,0 +1,211 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    23 #include <xcm_attr_types.h>
    +
    24 
    +
    25 #include <stdbool.h>
    +
    26 #include <stddef.h>
    +
    27 #include <stdint.h>
    +
    28 
    +
    29 struct xcm_attr_map;
    +
    30 
    +
    31 
    +
    37 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38 
    +
    39 
    +
    47 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48 
    +
    66 void 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 
    +
    80 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81  const char *attr_name, bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name, int64_t attr_value);
    +
    95 
    +
    96 
    +
    106 void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107  const char *attr_name, double attr_value);
    +
    108 
    +
    109 
    +
    119 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120  const char *attr_name, const char *attr_value);
    +
    121 
    +
    122 
    +
    132 void 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 
    +
    146 void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147  const struct xcm_attr_map *src_map);
    +
    148 
    +
    149 
    +
    166 const 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 
    +
    186 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187  const char *attr_name);
    +
    188 
    +
    189 
    +
    204 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205  const char *attr_name);
    +
    206 
    +
    207 
    +
    222 const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223  const char *attr_name);
    +
    224 
    +
    225 
    +
    240 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241  const char *attr_name);
    +
    242 
    +
    257 const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258  const char *attr_name);
    +
    259 
    +
    268 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269  const char *attr_name);
    +
    270 
    +
    271 
    +
    280 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281 
    +
    282 
    +
    290 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291 
    +
    292 
    +
    296 typedef 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 
    +
    315 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316  xcm_attr_map_foreach_cb cb, void *user);
    +
    317 
    +
    318 
    +
    327 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328  const struct xcm_attr_map *attr_map_b);
    +
    329 
    +
    338 void 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)
    +
    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)
    +
    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_bin(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)
    +
    const int64_t * xcm_attr_map_get_int64(const 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..33f6b2107 --- /dev/null +++ b/api/0.24/xcm__attr__types_8h.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..85787e3e8 --- /dev/null +++ b/api/0.24/xcm__attr__types_8h_source.html @@ -0,0 +1,107 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + + +
    30 };
    +
    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..5f0c82b4e --- /dev/null +++ b/api/0.24/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..fdc0440ac --- /dev/null +++ b/api/0.24/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..eef795d10 --- /dev/null +++ b/api/0.24/xcm__version_8h.html @@ -0,0 +1,266 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..13bff4491 --- /dev/null +++ b/api/0.24/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    59 unsigned int xcm_version_major(void);
    +
    60 
    +
    67 unsigned int xcm_version_minor(void);
    +
    68 
    +
    74 unsigned int xcm_version_patch(void);
    +
    75 
    +
    84 const char *xcm_version(void);
    +
    85 
    +
    91 unsigned int xcm_version_api_major(void);
    +
    92 
    +
    98 unsigned int xcm_version_api_minor(void);
    +
    99 
    +
    108 const char *xcm_version_api(void);
    +
    109 
    +
    110 #ifdef __cplusplus
    +
    111 }
    +
    112 #endif
    +
    113 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..90109b40e --- /dev/null +++ b/api/0.25/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/api/0.25/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/api/0.25/bdwn.png differ diff --git a/api/0.25/classes.html b/api/0.25/classes.html new file mode 100644 index 000000000..7d7e224be --- /dev/null +++ b/api/0.25/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..917ec4404 --- /dev/null +++ b/api/0.25/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,103 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    file  xcm_version.h [code]
     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.png b/api/0.25/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/api/0.25/doc.png differ diff --git a/api/0.25/doxygen.css b/api/0.25/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/api/0.25/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/api/0.25/doxygen.svg b/api/0.25/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/api/0.25/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.25/dynsections.js b/api/0.25/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/api/0.25/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/api/0.25/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/api/0.25/folderclosed.png differ diff --git a/api/0.25/folderopen.png b/api/0.25/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/api/0.25/folderopen.png differ diff --git a/api/0.25/functions.html b/api/0.25/functions.html new file mode 100644 index 000000000..d5152a509 --- /dev/null +++ b/api/0.25/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..9fc2e02ff --- /dev/null +++ b/api/0.25/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.25/globals.html b/api/0.25/globals.html new file mode 100644 index 000000000..ee6f6e5d4 --- /dev/null +++ b/api/0.25/globals.html @@ -0,0 +1,395 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..78bed79ff --- /dev/null +++ b/api/0.25/globals_defs.html @@ -0,0 +1,138 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.25/globals_enum.html b/api/0.25/globals_enum.html new file mode 100644 index 000000000..3f15c68e3 --- /dev/null +++ b/api/0.25/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.25/globals_eval.html b/api/0.25/globals_eval.html new file mode 100644 index 000000000..cf22fa951 --- /dev/null +++ b/api/0.25/globals_eval.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.25/globals_func.html b/api/0.25/globals_func.html new file mode 100644 index 000000000..90c68dbf5 --- /dev/null +++ b/api/0.25/globals_func.html @@ -0,0 +1,305 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - x -

    +
    + + + + diff --git a/api/0.25/globals_type.html b/api/0.25/globals_type.html new file mode 100644 index 000000000..44e99dc08 --- /dev/null +++ b/api/0.25/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/0.25/group__api__version.html b/api/0.25/group__api__version.html new file mode 100644 index 000000000..93aa762df --- /dev/null +++ b/api/0.25/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..14cf98f5b --- /dev/null +++ b/api/0.25/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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/api/0.25/index.html b/api/0.25/index.html new file mode 100644 index 000000000..e615ec297 --- /dev/null +++ b/api/0.25/index.html @@ -0,0 +1,711 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/api/0.25/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/api/0.25/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/api/0.25/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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..6a140e8ce --- /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:"Modules",url:"modules.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/modules.html b/api/0.25/modules.html new file mode 100644 index 000000000..1ddee738a --- /dev/null +++ b/api/0.25/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/api/0.25/nb_connect_and_send.png new file mode 100644 index 000000000..2bfaec2e1 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..4ce56aa7b 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..b29bdce34 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/api/0.25/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/api/0.25/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.25/search/all_0.js b/api/0.25/search/all_0.js new file mode 100644 index 000000000..869f460ae --- /dev/null +++ b/api/0.25/search/all_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['api_20version_1',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.25/search/all_1.html b/api/0.25/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/api/0.25/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.25/search/all_1.js b/api/0.25/search/all_1.js new file mode 100644 index 000000000..204c38c05 --- /dev/null +++ b/api/0.25/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_2',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.25/search/all_2.html b/api/0.25/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/api/0.25/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.25/search/all_2.js b/api/0.25/search/all_2.js new file mode 100644 index 000000000..d6a623719 --- /dev/null +++ b/api/0.25/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_3',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.25/search/all_3.html b/api/0.25/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/api/0.25/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.25/search/all_3.js b/api/0.25/search/all_3.js new file mode 100644 index 000000000..e908022ab --- /dev/null +++ b/api/0.25/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_4',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_5',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.25/search/all_4.html b/api/0.25/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/api/0.25/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.25/search/all_4.js b/api/0.25/search/all_4.js new file mode 100644 index 000000000..6d0e67254 --- /dev/null +++ b/api/0.25/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_6',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.25/search/all_5.html b/api/0.25/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/api/0.25/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.25/search/all_5.js b/api/0.25/search/all_5.js new file mode 100644 index 000000000..4f4fb05a9 --- /dev/null +++ b/api/0.25/search/all_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_7',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.25/search/all_6.html b/api/0.25/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/api/0.25/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.25/search/all_6.js b/api/0.25/search/all_6.js new file mode 100644 index 000000000..5debab10e --- /dev/null +++ b/api/0.25/search/all_6.js @@ -0,0 +1,119 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_14',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_15',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_16',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_17',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_18',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_19',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_20',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_21',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_22',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_23',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_24',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_25',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_26',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_27',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_28',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_29',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_30',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_31',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_32',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_33',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_34',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_35',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_36',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_37',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_38',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_39',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_40',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_41',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_51',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_59',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_60',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_61',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_62',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_63',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_84',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',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#a4d8d62a9625b49993b7d6ec03de8e765',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#ad52a0d86b7b5bf802835758cc9251e2e',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#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_98',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',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',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_109',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_110',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_111',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_112',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_113',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_114',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_115',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_116',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_117',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_118',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_119',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_120',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_121',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_122',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_123',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.25/search/classes_0.html b/api/0.25/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/api/0.25/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.25/search/classes_0.js b/api/0.25/search/classes_0.js new file mode 100644 index 000000000..674a1aa87 --- /dev/null +++ b/api/0.25/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_124',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_125',['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..a933eea1a --- /dev/null +++ b/api/0.25/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/api/0.25/search/defines_0.html b/api/0.25/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/api/0.25/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.25/search/defines_0.js b/api/0.25/search/defines_0.js new file mode 100644 index 000000000..cbc847631 --- /dev/null +++ b/api/0.25/search/defines_0.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['xcm_5fbtcp_5fproto_223',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_224',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_225',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_226',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_227',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_228',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_229',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_230',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_231',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_232',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_233',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_234',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_235',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_236',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_237',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.25/search/enums_0.html b/api/0.25/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/api/0.25/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.25/search/enums_0.js b/api/0.25/search/enums_0.js new file mode 100644 index 000000000..a21bfa3c9 --- /dev/null +++ b/api/0.25/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_217',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.25/search/enumvalues_0.html b/api/0.25/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/api/0.25/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.25/search/enumvalues_0.js b/api/0.25/search/enumvalues_0.js new file mode 100644 index 000000000..21ed3c3a7 --- /dev/null +++ b/api/0.25/search/enumvalues_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_218',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_219',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_220',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_221',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_222',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.25/search/files_0.html b/api/0.25/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/api/0.25/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.25/search/files_0.js b/api/0.25/search/files_0.js new file mode 100644 index 000000000..8fd701d69 --- /dev/null +++ b/api/0.25/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_126',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_127',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_128',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_129',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_130',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_131',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_132',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/api/0.25/search/functions_0.html b/api/0.25/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/api/0.25/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.25/search/functions_0.js b/api/0.25/search/functions_0.js new file mode 100644 index 000000000..c9b272d52 --- /dev/null +++ b/api/0.25/search/functions_0.js @@ -0,0 +1,80 @@ +var searchData= +[ + ['xcm_5faccept_133',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_134',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fis_5fsupported_135',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_136',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_137',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_138',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_139',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_140',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_141',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_142',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_143',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_144',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_145',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_146',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_147',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_148',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_149',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_150',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_151',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_152',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_153',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_154',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_155',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_156',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_157',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_158',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_159',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_160',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_161',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_162',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_163',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_164',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_165',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_166',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_167',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_168',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_169',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_170',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_171',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_172',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_173',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_174',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_175',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_176',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_177',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_178',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_179',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_180',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_181',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_182',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_183',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_184',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_185',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_186',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_187',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_188',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_189',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_190',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_191',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_192',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_193',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_194',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_195',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_196',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_197',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_198',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_199',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_200',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_201',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_202',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_203',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_204',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_205',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_206',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_207',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_208',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_209',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.25/search/groups_0.html b/api/0.25/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/api/0.25/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.25/search/groups_0.js b/api/0.25/search/groups_0.js new file mode 100644 index 000000000..ee66bd8d9 --- /dev/null +++ b/api/0.25/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_238',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.25/search/groups_1.html b/api/0.25/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/api/0.25/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.25/search/groups_1.js b/api/0.25/search/groups_1.js new file mode 100644 index 000000000..73d61cda3 --- /dev/null +++ b/api/0.25/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_239',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.25/search/mag_sel.svg b/api/0.25/search/mag_sel.svg new file mode 100644 index 000000000..03626f64a --- /dev/null +++ b/api/0.25/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/api/0.25/search/nomatches.html b/api/0.25/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/api/0.25/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/api/0.25/search/pages_0.html b/api/0.25/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/api/0.25/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.25/search/pages_0.js b/api/0.25/search/pages_0.js new file mode 100644 index 000000000..f9ea5bd4c --- /dev/null +++ b/api/0.25/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_240',['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..9074198f8 --- /dev/null +++ b/api/0.25/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/api/0.25/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.25/search/typedefs_0.js b/api/0.25/search/typedefs_0.js new file mode 100644 index 000000000..87725bd99 --- /dev/null +++ b/api/0.25/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_215',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_216',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/api/0.25/search/variables_0.html b/api/0.25/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/api/0.25/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.25/search/variables_0.js b/api/0.25/search/variables_0.js new file mode 100644 index 000000000..e53d6bcee --- /dev/null +++ b/api/0.25/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_210',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/0.25/search/variables_1.html b/api/0.25/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/api/0.25/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.25/search/variables_1.js b/api/0.25/search/variables_1.js new file mode 100644 index 000000000..a03fd1773 --- /dev/null +++ b/api/0.25/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_211',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/0.25/search/variables_2.html b/api/0.25/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/api/0.25/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.25/search/variables_2.js b/api/0.25/search/variables_2.js new file mode 100644 index 000000000..9e553a3fe --- /dev/null +++ b/api/0.25/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_212',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_213',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/0.25/search/variables_3.html b/api/0.25/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/api/0.25/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/0.25/search/variables_3.js b/api/0.25/search/variables_3.js new file mode 100644 index 000000000..32c76bd22 --- /dev/null +++ b/api/0.25/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_214',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.25/server_accept.png b/api/0.25/server_accept.png new file mode 100644 index 000000000..f1ae8ad49 Binary files /dev/null and b/api/0.25/server_accept.png differ diff --git a/api/0.25/splitbar.png b/api/0.25/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/api/0.25/splitbar.png differ diff --git a/api/0.25/structxcm__addr__host.html b/api/0.25/structxcm__addr__host.html new file mode 100644 index 000000000..cc9d6b69d --- /dev/null +++ b/api/0.25/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..13351734e --- /dev/null +++ b/api/0.25/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/api/0.25/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/api/0.25/xcm_8h.html b/api/0.25/xcm_8h.html new file mode 100644 index 000000000..ae0a3d9e9 --- /dev/null +++ b/api/0.25/xcm_8h.html @@ -0,0 +1,910 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..6114e0c35 --- /dev/null +++ b/api/0.25/xcm_8h_source.html @@ -0,0 +1,167 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1465 struct xcm_socket;
    +
    1466 
    +
    1519 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1520 
    +
    1542 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1543  const struct xcm_attr_map *attrs);
    +
    1544 
    +
    1580 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1581 
    +
    1597 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1598  const struct xcm_attr_map *attrs);
    +
    1599 
    +
    1615 int xcm_close(struct xcm_socket *socket);
    +
    1616 
    +
    1636 void xcm_cleanup(struct xcm_socket *socket);
    +
    1637 
    +
    1656 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1657 
    +
    1677 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1678  const struct xcm_attr_map *attrs);
    +
    1679 
    +
    1702 int xcm_send(struct xcm_socket *__restrict conn_socket,
    +
    1703  const void *__restrict buf, size_t len);
    +
    1704 
    +
    1728 int 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 
    +
    1800 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1801 
    +
    1849 int xcm_fd(struct xcm_socket *socket);
    +
    1850 
    +
    1896 int xcm_finish(struct xcm_socket *socket);
    +
    1897 
    +
    1938 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1939 
    +
    1954 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1955 
    +
    1972 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1973 
    +
    1988 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    int xcm_receive(struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    int xcm_send(struct xcm_socket *__restrict conn_socket, const void *__restrict 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_server_a(const char *local_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.25/xcm__addr_8h.html b/api/0.25/xcm__addr_8h.html new file mode 100644 index 000000000..66be990c2 --- /dev/null +++ b/api/0.25/xcm__addr_8h.html @@ -0,0 +1,1260 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..1427bb690 --- /dev/null +++ b/api/0.25/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) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    47 enum 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];
    +
    66  } addr;
    +
    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 
    +
    96 bool xcm_addr_is_valid(const char *xcm_addr_s);
    +
    97 
    +
    107 bool xcm_addr_is_supported(const char *xcm_addr_s);
    +
    108 
    +
    122 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    123 
    +
    137 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    138  uint16_t *port);
    +
    139 
    +
    153 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    154  uint16_t *port);
    +
    155 
    +
    170 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    171  uint16_t *port);
    +
    172 
    +
    187 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    188  uint16_t *port);
    +
    189 
    +
    203 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    204 
    +
    218 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    219  size_t capacity);
    +
    220 
    +
    234 int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host,
    +
    235  uint16_t *port);
    +
    236 
    +
    250 int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    251  uint16_t *port);
    +
    252 
    +
    268 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    269  char *utls_addr_s, size_t capacity);
    +
    270 
    +
    286 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    287  char *tls_addr_s, size_t capacity);
    +
    288 
    +
    304 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    305  char *tcp_addr_s, size_t capacity);
    +
    306 
    +
    322 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    323  char *sctp_addr_s, size_t capacity);
    +
    324 
    +
    339 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    340 
    +
    355 int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    356 
    +
    372 int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port,
    +
    373  char *btcp_addr_s, size_t capacity);
    +
    374 
    +
    390 int 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..679db4675 --- /dev/null +++ b/api/0.25/xcm__attr_8h.html @@ -0,0 +1,774 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..120b5b46a --- /dev/null +++ b/api/0.25/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) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_double(struct xcm_socket *socket, const char *name,
    +
    89  double value);
    +
    90 
    +
    103 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    104  const char *value);
    +
    105 
    +
    131 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    132  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    133 
    +
    150 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    151  bool *value);
    +
    152 
    +
    169 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    170  int64_t *value);
    +
    171 
    +
    188 int xcm_attr_get_double(struct xcm_socket *socket, const char *name,
    +
    189  double *value);
    +
    190 
    +
    209 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    210  char *value, size_t capacity);
    +
    211 
    +
    229 int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    230  void *value, size_t capacity);
    +
    231 
    +
    233 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    234  void *value, size_t value_len, void *cb_data);
    +
    235 
    +
    249 void 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..8f76b792a --- /dev/null +++ b/api/0.25/xcm__attr__map_8h.html @@ -0,0 +1,985 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..b8c9c3761 --- /dev/null +++ b/api/0.25/xcm__attr__map_8h_source.html @@ -0,0 +1,211 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    23 #include <xcm_attr_types.h>
    +
    24 
    +
    25 #include <stdbool.h>
    +
    26 #include <stddef.h>
    +
    27 #include <stdint.h>
    +
    28 
    +
    29 struct xcm_attr_map;
    +
    30 
    +
    31 
    +
    37 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38 
    +
    39 
    +
    47 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48 
    +
    66 void 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 
    +
    80 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81  const char *attr_name, bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name, int64_t attr_value);
    +
    95 
    +
    96 
    +
    106 void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107  const char *attr_name, double attr_value);
    +
    108 
    +
    109 
    +
    119 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120  const char *attr_name, const char *attr_value);
    +
    121 
    +
    122 
    +
    132 void 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 
    +
    146 void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147  const struct xcm_attr_map *src_map);
    +
    148 
    +
    149 
    +
    166 const 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 
    +
    186 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187  const char *attr_name);
    +
    188 
    +
    189 
    +
    204 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205  const char *attr_name);
    +
    206 
    +
    207 
    +
    222 const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223  const char *attr_name);
    +
    224 
    +
    225 
    +
    240 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241  const char *attr_name);
    +
    242 
    +
    257 const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258  const char *attr_name);
    +
    259 
    +
    268 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269  const char *attr_name);
    +
    270 
    +
    271 
    +
    280 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281 
    +
    282 
    +
    290 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291 
    +
    292 
    +
    296 typedef 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 
    +
    315 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316  xcm_attr_map_foreach_cb cb, void *user);
    +
    317 
    +
    318 
    +
    327 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328  const struct xcm_attr_map *attr_map_b);
    +
    329 
    +
    338 void 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)
    +
    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)
    +
    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_bin(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)
    +
    const int64_t * xcm_attr_map_get_int64(const 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..ad2faaaab --- /dev/null +++ b/api/0.25/xcm__attr__types_8h.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..32a9d7c2f --- /dev/null +++ b/api/0.25/xcm__attr__types_8h_source.html @@ -0,0 +1,107 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + + +
    30 };
    +
    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..224520e3c --- /dev/null +++ b/api/0.25/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..7735eede1 --- /dev/null +++ b/api/0.25/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..d2a80906e --- /dev/null +++ b/api/0.25/xcm__version_8h.html @@ -0,0 +1,266 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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/api/0.25/xcm__version_8h_source.html b/api/0.25/xcm__version_8h_source.html new file mode 100644 index 000000000..a8ea88e24 --- /dev/null +++ b/api/0.25/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    59 unsigned int xcm_version_major(void);
    +
    60 
    +
    67 unsigned int xcm_version_minor(void);
    +
    68 
    +
    74 unsigned int xcm_version_patch(void);
    +
    75 
    +
    84 const char *xcm_version(void);
    +
    85 
    +
    91 unsigned int xcm_version_api_major(void);
    +
    92 
    +
    98 unsigned int xcm_version_api_minor(void);
    +
    99 
    +
    108 const char *xcm_version_api(void);
    +
    109 
    +
    110 #ifdef __cplusplus
    +
    111 }
    +
    112 #endif
    +
    113 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..da70c31ff --- /dev/null +++ b/api/head/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/api/head/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/api/head/bdwn.png differ diff --git a/api/head/classes.html b/api/head/classes.html new file mode 100644 index 000000000..e3f46c5c2 --- /dev/null +++ b/api/head/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..230393a94 --- /dev/null +++ b/api/head/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,103 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    file  xcm_version.h [code]
     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/head/doc.png b/api/head/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/api/head/doc.png differ diff --git a/api/head/doxygen.css b/api/head/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/api/head/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/api/head/doxygen.svg b/api/head/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/api/head/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/head/dynsections.js b/api/head/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/api/head/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/head/folderclosed.png b/api/head/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/api/head/folderclosed.png differ diff --git a/api/head/folderopen.png b/api/head/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/api/head/folderopen.png differ diff --git a/api/head/functions.html b/api/head/functions.html new file mode 100644 index 000000000..4a174d43b --- /dev/null +++ b/api/head/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..0641b2e97 --- /dev/null +++ b/api/head/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/head/globals.html b/api/head/globals.html new file mode 100644 index 000000000..3c2d48b0b --- /dev/null +++ b/api/head/globals.html @@ -0,0 +1,395 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..304d960bb --- /dev/null +++ b/api/head/globals_defs.html @@ -0,0 +1,138 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/head/globals_enum.html b/api/head/globals_enum.html new file mode 100644 index 000000000..04513e249 --- /dev/null +++ b/api/head/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/head/globals_eval.html b/api/head/globals_eval.html new file mode 100644 index 000000000..5160cbb23 --- /dev/null +++ b/api/head/globals_eval.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/head/globals_func.html b/api/head/globals_func.html new file mode 100644 index 000000000..a26596fdc --- /dev/null +++ b/api/head/globals_func.html @@ -0,0 +1,305 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - x -

    +
    + + + + diff --git a/api/head/globals_type.html b/api/head/globals_type.html new file mode 100644 index 000000000..80a550c98 --- /dev/null +++ b/api/head/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/head/group__api__version.html b/api/head/group__api__version.html new file mode 100644 index 000000000..0f08b4af0 --- /dev/null +++ b/api/head/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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/head/group__lib__version.html b/api/head/group__lib__version.html new file mode 100644 index 000000000..7f0858a9b --- /dev/null +++ b/api/head/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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/api/head/index.html b/api/head/index.html new file mode 100644 index 000000000..f61061b52 --- /dev/null +++ b/api/head/index.html @@ -0,0 +1,711 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/head/jquery.js b/api/head/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/api/head/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/api/head/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/api/head/menudata.js b/api/head/menudata.js new file mode 100644 index 000000000..6a140e8ce --- /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:"Modules",url:"modules.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/modules.html b/api/head/modules.html new file mode 100644 index 000000000..75399f90c --- /dev/null +++ b/api/head/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/api/head/nb_connect_and_send.png new file mode 100644 index 000000000..2bfaec2e1 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..4ce56aa7b 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..b29bdce34 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/api/head/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/api/head/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/head/search/all_0.js b/api/head/search/all_0.js new file mode 100644 index 000000000..869f460ae --- /dev/null +++ b/api/head/search/all_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['api_20version_1',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/head/search/all_1.html b/api/head/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/api/head/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/head/search/all_1.js b/api/head/search/all_1.js new file mode 100644 index 000000000..204c38c05 --- /dev/null +++ b/api/head/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_2',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/head/search/all_2.html b/api/head/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/api/head/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/head/search/all_2.js b/api/head/search/all_2.js new file mode 100644 index 000000000..d6a623719 --- /dev/null +++ b/api/head/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_3',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/head/search/all_3.html b/api/head/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/api/head/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/head/search/all_3.js b/api/head/search/all_3.js new file mode 100644 index 000000000..e908022ab --- /dev/null +++ b/api/head/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_4',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_5',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/head/search/all_4.html b/api/head/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/api/head/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/head/search/all_4.js b/api/head/search/all_4.js new file mode 100644 index 000000000..6d0e67254 --- /dev/null +++ b/api/head/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_6',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/head/search/all_5.html b/api/head/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/api/head/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/head/search/all_5.js b/api/head/search/all_5.js new file mode 100644 index 000000000..4f4fb05a9 --- /dev/null +++ b/api/head/search/all_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_7',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/head/search/all_6.html b/api/head/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/api/head/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/head/search/all_6.js b/api/head/search/all_6.js new file mode 100644 index 000000000..5debab10e --- /dev/null +++ b/api/head/search/all_6.js @@ -0,0 +1,119 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_14',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_15',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_16',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_17',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_18',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_19',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_20',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_21',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_22',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_23',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_24',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_25',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_26',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_27',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_28',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_29',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_30',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_31',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_32',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_33',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_34',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_35',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_36',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_37',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_38',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_39',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_40',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_41',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_51',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_59',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_60',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_61',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_62',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_63',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_84',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',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#a4d8d62a9625b49993b7d6ec03de8e765',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#ad52a0d86b7b5bf802835758cc9251e2e',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#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_98',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',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',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_109',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_110',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_111',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_112',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_113',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_114',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_115',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_116',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_117',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_118',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_119',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_120',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_121',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_122',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_123',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/head/search/classes_0.html b/api/head/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/api/head/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/head/search/classes_0.js b/api/head/search/classes_0.js new file mode 100644 index 000000000..674a1aa87 --- /dev/null +++ b/api/head/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_124',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_125',['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..a933eea1a --- /dev/null +++ b/api/head/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/api/head/search/defines_0.html b/api/head/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/api/head/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/head/search/defines_0.js b/api/head/search/defines_0.js new file mode 100644 index 000000000..cbc847631 --- /dev/null +++ b/api/head/search/defines_0.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['xcm_5fbtcp_5fproto_223',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_224',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_225',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_226',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_227',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_228',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_229',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_230',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_231',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_232',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_233',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_234',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_235',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_236',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_237',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/head/search/enums_0.html b/api/head/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/api/head/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/head/search/enums_0.js b/api/head/search/enums_0.js new file mode 100644 index 000000000..a21bfa3c9 --- /dev/null +++ b/api/head/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_217',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/head/search/enumvalues_0.html b/api/head/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/api/head/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/head/search/enumvalues_0.js b/api/head/search/enumvalues_0.js new file mode 100644 index 000000000..21ed3c3a7 --- /dev/null +++ b/api/head/search/enumvalues_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_218',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_219',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_220',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_221',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_222',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/head/search/files_0.html b/api/head/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/api/head/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/head/search/files_0.js b/api/head/search/files_0.js new file mode 100644 index 000000000..8fd701d69 --- /dev/null +++ b/api/head/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_126',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_127',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_128',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_129',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_130',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_131',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_132',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/api/head/search/functions_0.html b/api/head/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/api/head/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/head/search/functions_0.js b/api/head/search/functions_0.js new file mode 100644 index 000000000..c9b272d52 --- /dev/null +++ b/api/head/search/functions_0.js @@ -0,0 +1,80 @@ +var searchData= +[ + ['xcm_5faccept_133',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_134',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fis_5fsupported_135',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_136',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_137',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_138',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_139',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_140',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_141',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_142',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_143',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_144',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_145',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_146',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_147',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_148',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_149',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_150',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_151',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_152',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_153',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_154',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_155',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_156',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_157',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_158',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_159',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_160',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_161',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_162',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_163',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_164',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_165',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_166',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_167',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_168',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_169',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_170',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_171',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_172',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_173',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_174',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_175',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_176',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_177',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_178',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_179',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_180',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_181',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_182',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_183',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_184',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_185',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_186',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_187',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_188',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_189',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_190',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_191',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_192',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_193',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_194',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_195',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_196',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_197',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_198',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_199',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_200',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_201',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_202',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_203',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_204',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_205',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_206',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_207',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_208',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_209',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/head/search/groups_0.html b/api/head/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/api/head/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/head/search/groups_0.js b/api/head/search/groups_0.js new file mode 100644 index 000000000..ee66bd8d9 --- /dev/null +++ b/api/head/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_238',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/head/search/groups_1.html b/api/head/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/api/head/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/head/search/groups_1.js b/api/head/search/groups_1.js new file mode 100644 index 000000000..73d61cda3 --- /dev/null +++ b/api/head/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_239',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/head/search/mag_sel.svg b/api/head/search/mag_sel.svg new file mode 100644 index 000000000..03626f64a --- /dev/null +++ b/api/head/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/api/head/search/nomatches.html b/api/head/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/api/head/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/api/head/search/pages_0.html b/api/head/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/api/head/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/head/search/pages_0.js b/api/head/search/pages_0.js new file mode 100644 index 000000000..f9ea5bd4c --- /dev/null +++ b/api/head/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_240',['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..9074198f8 --- /dev/null +++ b/api/head/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/api/head/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/head/search/typedefs_0.js b/api/head/search/typedefs_0.js new file mode 100644 index 000000000..87725bd99 --- /dev/null +++ b/api/head/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_215',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_216',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/api/head/search/variables_0.html b/api/head/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/api/head/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/head/search/variables_0.js b/api/head/search/variables_0.js new file mode 100644 index 000000000..e53d6bcee --- /dev/null +++ b/api/head/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_210',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/head/search/variables_1.html b/api/head/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/api/head/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/head/search/variables_1.js b/api/head/search/variables_1.js new file mode 100644 index 000000000..a03fd1773 --- /dev/null +++ b/api/head/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_211',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/head/search/variables_2.html b/api/head/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/api/head/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/head/search/variables_2.js b/api/head/search/variables_2.js new file mode 100644 index 000000000..9e553a3fe --- /dev/null +++ b/api/head/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_212',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_213',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/head/search/variables_3.html b/api/head/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/api/head/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/head/search/variables_3.js b/api/head/search/variables_3.js new file mode 100644 index 000000000..32c76bd22 --- /dev/null +++ b/api/head/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_214',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/head/server_accept.png b/api/head/server_accept.png new file mode 100644 index 000000000..f1ae8ad49 Binary files /dev/null and b/api/head/server_accept.png differ diff --git a/api/head/splitbar.png b/api/head/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/api/head/splitbar.png differ diff --git a/api/head/structxcm__addr__host.html b/api/head/structxcm__addr__host.html new file mode 100644 index 000000000..1385bffa1 --- /dev/null +++ b/api/head/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..40e64090e --- /dev/null +++ b/api/head/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/api/head/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/api/head/xcm_8h.html b/api/head/xcm_8h.html new file mode 100644 index 000000000..a30af554a --- /dev/null +++ b/api/head/xcm_8h.html @@ -0,0 +1,910 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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/head/xcm_8h_source.html b/api/head/xcm_8h_source.html new file mode 100644 index 000000000..430824121 --- /dev/null +++ b/api/head/xcm_8h_source.html @@ -0,0 +1,167 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1465 struct xcm_socket;
    +
    1466 
    +
    1519 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1520 
    +
    1542 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1543  const struct xcm_attr_map *attrs);
    +
    1544 
    +
    1580 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1581 
    +
    1597 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1598  const struct xcm_attr_map *attrs);
    +
    1599 
    +
    1615 int xcm_close(struct xcm_socket *socket);
    +
    1616 
    +
    1636 void xcm_cleanup(struct xcm_socket *socket);
    +
    1637 
    +
    1656 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1657 
    +
    1677 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1678  const struct xcm_attr_map *attrs);
    +
    1679 
    +
    1702 int xcm_send(struct xcm_socket *__restrict conn_socket,
    +
    1703  const void *__restrict buf, size_t len);
    +
    1704 
    +
    1728 int 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 
    +
    1800 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1801 
    +
    1849 int xcm_fd(struct xcm_socket *socket);
    +
    1850 
    +
    1896 int xcm_finish(struct xcm_socket *socket);
    +
    1897 
    +
    1938 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1939 
    +
    1954 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1955 
    +
    1972 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1973 
    +
    1988 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    int xcm_receive(struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    int xcm_send(struct xcm_socket *__restrict conn_socket, const void *__restrict 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_server_a(const char *local_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/head/xcm__addr_8h.html b/api/head/xcm__addr_8h.html new file mode 100644 index 000000000..ee1af15be --- /dev/null +++ b/api/head/xcm__addr_8h.html @@ -0,0 +1,1260 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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/head/xcm__addr_8h_source.html b/api/head/xcm__addr_8h_source.html new file mode 100644 index 000000000..e9f71f18b --- /dev/null +++ b/api/head/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) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    47 enum 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];
    +
    66  } addr;
    +
    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 
    +
    96 bool xcm_addr_is_valid(const char *xcm_addr_s);
    +
    97 
    +
    107 bool xcm_addr_is_supported(const char *xcm_addr_s);
    +
    108 
    +
    122 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    123 
    +
    137 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    138  uint16_t *port);
    +
    139 
    +
    153 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    154  uint16_t *port);
    +
    155 
    +
    170 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    171  uint16_t *port);
    +
    172 
    +
    187 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    188  uint16_t *port);
    +
    189 
    +
    203 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    204 
    +
    218 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    219  size_t capacity);
    +
    220 
    +
    234 int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host,
    +
    235  uint16_t *port);
    +
    236 
    +
    250 int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    251  uint16_t *port);
    +
    252 
    +
    268 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    269  char *utls_addr_s, size_t capacity);
    +
    270 
    +
    286 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    287  char *tls_addr_s, size_t capacity);
    +
    288 
    +
    304 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    305  char *tcp_addr_s, size_t capacity);
    +
    306 
    +
    322 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    323  char *sctp_addr_s, size_t capacity);
    +
    324 
    +
    339 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    340 
    +
    355 int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    356 
    +
    372 int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port,
    +
    373  char *btcp_addr_s, size_t capacity);
    +
    374 
    +
    390 int 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/head/xcm__attr_8h.html b/api/head/xcm__attr_8h.html new file mode 100644 index 000000000..5bcc6c20e --- /dev/null +++ b/api/head/xcm__attr_8h.html @@ -0,0 +1,774 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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/head/xcm__attr_8h_source.html b/api/head/xcm__attr_8h_source.html new file mode 100644 index 000000000..6e808a2d6 --- /dev/null +++ b/api/head/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) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_double(struct xcm_socket *socket, const char *name,
    +
    89  double value);
    +
    90 
    +
    103 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    104  const char *value);
    +
    105 
    +
    131 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    132  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    133 
    +
    150 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    151  bool *value);
    +
    152 
    +
    169 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    170  int64_t *value);
    +
    171 
    +
    188 int xcm_attr_get_double(struct xcm_socket *socket, const char *name,
    +
    189  double *value);
    +
    190 
    +
    209 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    210  char *value, size_t capacity);
    +
    211 
    +
    229 int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    230  void *value, size_t capacity);
    +
    231 
    +
    233 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    234  void *value, size_t value_len, void *cb_data);
    +
    235 
    +
    249 void 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/head/xcm__attr__map_8h.html b/api/head/xcm__attr__map_8h.html new file mode 100644 index 000000000..b1bcba7c2 --- /dev/null +++ b/api/head/xcm__attr__map_8h.html @@ -0,0 +1,985 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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/head/xcm__attr__map_8h_source.html b/api/head/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..759c9da94 --- /dev/null +++ b/api/head/xcm__attr__map_8h_source.html @@ -0,0 +1,211 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    23 #include <xcm_attr_types.h>
    +
    24 
    +
    25 #include <stdbool.h>
    +
    26 #include <stddef.h>
    +
    27 #include <stdint.h>
    +
    28 
    +
    29 struct xcm_attr_map;
    +
    30 
    +
    31 
    +
    37 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38 
    +
    39 
    +
    47 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48 
    +
    66 void 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 
    +
    80 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81  const char *attr_name, bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name, int64_t attr_value);
    +
    95 
    +
    96 
    +
    106 void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107  const char *attr_name, double attr_value);
    +
    108 
    +
    109 
    +
    119 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120  const char *attr_name, const char *attr_value);
    +
    121 
    +
    122 
    +
    132 void 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 
    +
    146 void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147  const struct xcm_attr_map *src_map);
    +
    148 
    +
    149 
    +
    166 const 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 
    +
    186 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187  const char *attr_name);
    +
    188 
    +
    189 
    +
    204 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205  const char *attr_name);
    +
    206 
    +
    207 
    +
    222 const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223  const char *attr_name);
    +
    224 
    +
    225 
    +
    240 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241  const char *attr_name);
    +
    242 
    +
    257 const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258  const char *attr_name);
    +
    259 
    +
    268 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269  const char *attr_name);
    +
    270 
    +
    271 
    +
    280 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281 
    +
    282 
    +
    290 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291 
    +
    292 
    +
    296 typedef 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 
    +
    315 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316  xcm_attr_map_foreach_cb cb, void *user);
    +
    317 
    +
    318 
    +
    327 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328  const struct xcm_attr_map *attr_map_b);
    +
    329 
    +
    338 void 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)
    +
    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)
    +
    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_bin(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)
    +
    const int64_t * xcm_attr_map_get_int64(const 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    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..f64de3650 --- /dev/null +++ b/api/head/xcm__attr__types_8h.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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/head/xcm__attr__types_8h_source.html b/api/head/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..e1d24a95c --- /dev/null +++ b/api/head/xcm__attr__types_8h_source.html @@ -0,0 +1,107 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + + +
    30 };
    +
    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..606d6cb07 --- /dev/null +++ b/api/head/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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/head/xcm__compat_8h_source.html b/api/head/xcm__compat_8h_source.html new file mode 100644 index 000000000..ee6cd5592 --- /dev/null +++ b/api/head/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..0a0a42a26 --- /dev/null +++ b/api/head/xcm__version_8h.html @@ -0,0 +1,266 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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/api/head/xcm__version_8h_source.html b/api/head/xcm__version_8h_source.html new file mode 100644 index 000000000..7a01da1e9 --- /dev/null +++ b/api/head/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    59 unsigned int xcm_version_major(void);
    +
    60 
    +
    67 unsigned int xcm_version_minor(void);
    +
    68 
    +
    74 unsigned int xcm_version_patch(void);
    +
    75 
    +
    84 const char *xcm_version(void);
    +
    85 
    +
    91 unsigned int xcm_version_api_major(void);
    +
    92 
    +
    98 unsigned int xcm_version_api_minor(void);
    +
    99 
    +
    108 const char *xcm_version_api(void);
    +
    109 
    +
    110 #ifdef __cplusplus
    +
    111 }
    +
    112 #endif
    +
    113 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..ee2611576 --- /dev/null +++ b/api/latest/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/api/latest/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/api/latest/bdwn.png differ diff --git a/api/latest/classes.html b/api/latest/classes.html new file mode 100644 index 000000000..633c8d449 --- /dev/null +++ b/api/latest/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..0f5db6cf3 --- /dev/null +++ b/api/latest/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,103 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    file  xcm_version.h [code]
     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.png b/api/latest/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/api/latest/doc.png differ diff --git a/api/latest/doxygen.css b/api/latest/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/api/latest/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/api/latest/doxygen.svg b/api/latest/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/api/latest/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/latest/dynsections.js b/api/latest/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/api/latest/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/api/latest/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/api/latest/folderclosed.png differ diff --git a/api/latest/folderopen.png b/api/latest/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/api/latest/folderopen.png differ diff --git a/api/latest/functions.html b/api/latest/functions.html new file mode 100644 index 000000000..044ce8170 --- /dev/null +++ b/api/latest/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..18b1766ef --- /dev/null +++ b/api/latest/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/latest/globals.html b/api/latest/globals.html new file mode 100644 index 000000000..e226286a6 --- /dev/null +++ b/api/latest/globals.html @@ -0,0 +1,389 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..6e8cc170a --- /dev/null +++ b/api/latest/globals_defs.html @@ -0,0 +1,138 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/latest/globals_enum.html b/api/latest/globals_enum.html new file mode 100644 index 000000000..39ae7dbd8 --- /dev/null +++ b/api/latest/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/latest/globals_eval.html b/api/latest/globals_eval.html new file mode 100644 index 000000000..386868256 --- /dev/null +++ b/api/latest/globals_eval.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/latest/globals_func.html b/api/latest/globals_func.html new file mode 100644 index 000000000..4de93c685 --- /dev/null +++ b/api/latest/globals_func.html @@ -0,0 +1,299 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - x -

    +
    + + + + diff --git a/api/latest/globals_type.html b/api/latest/globals_type.html new file mode 100644 index 000000000..e75f288ee --- /dev/null +++ b/api/latest/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/api/latest/group__api__version.html b/api/latest/group__api__version.html new file mode 100644 index 000000000..a0b97eac6 --- /dev/null +++ b/api/latest/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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/latest/group__lib__version.html b/api/latest/group__lib__version.html new file mode 100644 index 000000000..1f01cae55 --- /dev/null +++ b/api/latest/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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/latest/index.html b/api/latest/index.html new file mode 100644 index 000000000..7a40de3f9 --- /dev/null +++ b/api/latest/index.html @@ -0,0 +1,711 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/api/latest/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/api/latest/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/api/latest/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/api/latest/menudata.js b/api/latest/menudata.js new file mode 100644 index 000000000..6a140e8ce --- /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:"Modules",url:"modules.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/modules.html b/api/latest/modules.html new file mode 100644 index 000000000..c0154e924 --- /dev/null +++ b/api/latest/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/api/latest/nb_connect_and_send.png new file mode 100644 index 000000000..2bfaec2e1 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..4ce56aa7b 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..b29bdce34 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/api/latest/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/api/latest/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/latest/search/all_0.js b/api/latest/search/all_0.js new file mode 100644 index 000000000..869f460ae --- /dev/null +++ b/api/latest/search/all_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['api_20version_1',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/latest/search/all_1.html b/api/latest/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/api/latest/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/latest/search/all_1.js b/api/latest/search/all_1.js new file mode 100644 index 000000000..204c38c05 --- /dev/null +++ b/api/latest/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_2',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/latest/search/all_2.html b/api/latest/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/api/latest/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/latest/search/all_2.js b/api/latest/search/all_2.js new file mode 100644 index 000000000..d6a623719 --- /dev/null +++ b/api/latest/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_3',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/latest/search/all_3.html b/api/latest/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/api/latest/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/latest/search/all_3.js b/api/latest/search/all_3.js new file mode 100644 index 000000000..e908022ab --- /dev/null +++ b/api/latest/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_4',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_5',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/latest/search/all_4.html b/api/latest/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/api/latest/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/latest/search/all_4.js b/api/latest/search/all_4.js new file mode 100644 index 000000000..6d0e67254 --- /dev/null +++ b/api/latest/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_6',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/latest/search/all_5.html b/api/latest/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/api/latest/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/latest/search/all_5.js b/api/latest/search/all_5.js new file mode 100644 index 000000000..4f4fb05a9 --- /dev/null +++ b/api/latest/search/all_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_7',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/latest/search/all_6.html b/api/latest/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/api/latest/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/latest/search/all_6.js b/api/latest/search/all_6.js new file mode 100644 index 000000000..6f8a0941a --- /dev/null +++ b/api/latest/search/all_6.js @@ -0,0 +1,117 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtcp_14',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_15',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_16',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_17',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_18',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_19',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_20',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_21',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_22',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_23',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_24',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_25',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_26',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_27',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_28',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_29',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_30',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_31',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_32',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_33',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_34',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_35',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_36',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_37',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_38',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_39',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_40',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_41',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_42',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_43',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_44',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_45',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_46',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_47',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_48',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_49',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_50',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_51',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_52',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_53',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_54',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_55',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_56',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_57',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_58',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_59',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_60',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_61',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_62',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_63',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_64',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_65',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_66',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_67',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_68',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_69',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_70',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_71',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_72',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_73',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_74',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_75',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtcp_5fproto_76',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_77',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_78',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_79',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_80',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_81',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_82',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_83',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_84',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_85',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_86',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_87',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_88',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_89',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_90',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_91',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_92',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_93',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_94',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_95',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_96',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_97',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_98',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_99',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_100',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_101',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_102',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_103',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_104',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_105',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_106',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_107',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_108',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_109',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_110',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_111',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_112',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_113',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_114',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_115',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_116',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_117',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_118',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_119',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_120',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_121',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/latest/search/classes_0.html b/api/latest/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/api/latest/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/latest/search/classes_0.js b/api/latest/search/classes_0.js new file mode 100644 index 000000000..46c72b27b --- /dev/null +++ b/api/latest/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_122',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_123',['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..a933eea1a --- /dev/null +++ b/api/latest/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/api/latest/search/defines_0.html b/api/latest/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/api/latest/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/latest/search/defines_0.js b/api/latest/search/defines_0.js new file mode 100644 index 000000000..389129bd6 --- /dev/null +++ b/api/latest/search/defines_0.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['xcm_5fbtcp_5fproto_219',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_220',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_221',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_222',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_223',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_224',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_225',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_226',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_227',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_228',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_229',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_230',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_231',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_232',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_233',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/latest/search/enums_0.html b/api/latest/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/api/latest/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/latest/search/enums_0.js b/api/latest/search/enums_0.js new file mode 100644 index 000000000..03d67d05f --- /dev/null +++ b/api/latest/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_213',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/latest/search/enumvalues_0.html b/api/latest/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/api/latest/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/latest/search/enumvalues_0.js b/api/latest/search/enumvalues_0.js new file mode 100644 index 000000000..53a864a29 --- /dev/null +++ b/api/latest/search/enumvalues_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_214',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_215',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_216',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_217',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_218',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/latest/search/files_0.html b/api/latest/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/api/latest/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/latest/search/files_0.js b/api/latest/search/files_0.js new file mode 100644 index 000000000..339f551ed --- /dev/null +++ b/api/latest/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_124',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_125',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_126',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_127',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_128',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_129',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_130',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/api/latest/search/functions_0.html b/api/latest/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/api/latest/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/latest/search/functions_0.js b/api/latest/search/functions_0.js new file mode 100644 index 000000000..5e38d5ab8 --- /dev/null +++ b/api/latest/search/functions_0.js @@ -0,0 +1,78 @@ +var searchData= +[ + ['xcm_5faccept_131',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_132',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtcp_133',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_134',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_135',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_136',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_137',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_138',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_139',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_140',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_141',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_142',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_143',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_144',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_145',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_146',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_147',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_148',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_149',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_150',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_151',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_152',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_153',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_154',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_155',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_156',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_157',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_158',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_159',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_160',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_161',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_162',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_163',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_164',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_165',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_166',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_167',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_168',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_169',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_170',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_171',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_172',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_173',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_174',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_175',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_176',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_177',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_178',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_179',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_180',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_181',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_182',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_183',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_184',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_185',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_186',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_187',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_188',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_189',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_190',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_191',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_192',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_193',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_194',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_195',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_196',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_197',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_198',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_199',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_200',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_201',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_202',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_203',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_204',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_205',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/latest/search/groups_0.html b/api/latest/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/api/latest/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/latest/search/groups_0.js b/api/latest/search/groups_0.js new file mode 100644 index 000000000..7c795c8d6 --- /dev/null +++ b/api/latest/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_234',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/latest/search/groups_1.html b/api/latest/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/api/latest/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/latest/search/groups_1.js b/api/latest/search/groups_1.js new file mode 100644 index 000000000..bdfe1de90 --- /dev/null +++ b/api/latest/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_235',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/latest/search/mag_sel.svg b/api/latest/search/mag_sel.svg new file mode 100644 index 000000000..03626f64a --- /dev/null +++ b/api/latest/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/api/latest/search/nomatches.html b/api/latest/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/api/latest/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/api/latest/search/pages_0.html b/api/latest/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/api/latest/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/latest/search/pages_0.js b/api/latest/search/pages_0.js new file mode 100644 index 000000000..04b117677 --- /dev/null +++ b/api/latest/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_236',['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..9074198f8 --- /dev/null +++ b/api/latest/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/api/latest/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/latest/search/typedefs_0.js b/api/latest/search/typedefs_0.js new file mode 100644 index 000000000..448720ea0 --- /dev/null +++ b/api/latest/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_211',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_212',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/api/latest/search/variables_0.html b/api/latest/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/api/latest/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/latest/search/variables_0.js b/api/latest/search/variables_0.js new file mode 100644 index 000000000..7b6435276 --- /dev/null +++ b/api/latest/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_206',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/api/latest/search/variables_1.html b/api/latest/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/api/latest/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/latest/search/variables_1.js b/api/latest/search/variables_1.js new file mode 100644 index 000000000..bf7bf9f9e --- /dev/null +++ b/api/latest/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_207',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/api/latest/search/variables_2.html b/api/latest/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/api/latest/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/latest/search/variables_2.js b/api/latest/search/variables_2.js new file mode 100644 index 000000000..08ecaf1cb --- /dev/null +++ b/api/latest/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_208',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_209',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/api/latest/search/variables_3.html b/api/latest/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/api/latest/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/api/latest/search/variables_3.js b/api/latest/search/variables_3.js new file mode 100644 index 000000000..df64ea794 --- /dev/null +++ b/api/latest/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_210',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/latest/server_accept.png b/api/latest/server_accept.png new file mode 100644 index 000000000..f1ae8ad49 Binary files /dev/null and b/api/latest/server_accept.png differ diff --git a/api/latest/splitbar.png b/api/latest/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/api/latest/splitbar.png differ diff --git a/api/latest/structxcm__addr__host.html b/api/latest/structxcm__addr__host.html new file mode 100644 index 000000000..63c35a380 --- /dev/null +++ b/api/latest/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..6778fe386 --- /dev/null +++ b/api/latest/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/api/latest/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/api/latest/xcm_8h.html b/api/latest/xcm_8h.html new file mode 100644 index 000000000..f1846eaf7 --- /dev/null +++ b/api/latest/xcm_8h.html @@ -0,0 +1,910 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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/latest/xcm_8h_source.html b/api/latest/xcm_8h_source.html new file mode 100644 index 000000000..be2cba815 --- /dev/null +++ b/api/latest/xcm_8h_source.html @@ -0,0 +1,167 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1465 struct xcm_socket;
    +
    1466 
    +
    1519 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1520 
    +
    1542 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1543  const struct xcm_attr_map *attrs);
    +
    1544 
    +
    1580 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1581 
    +
    1597 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1598  const struct xcm_attr_map *attrs);
    +
    1599 
    +
    1616 int xcm_close(struct xcm_socket *socket);
    +
    1617 
    +
    1637 void xcm_cleanup(struct xcm_socket *socket);
    +
    1638 
    +
    1657 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1658 
    +
    1678 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1679  const struct xcm_attr_map *attrs);
    +
    1680 
    +
    1703 int xcm_send(struct xcm_socket *__restrict conn_socket,
    +
    1704  const void *__restrict buf, size_t len);
    +
    1705 
    +
    1729 int 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 
    +
    1801 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1802 
    +
    1850 int xcm_fd(struct xcm_socket *socket);
    +
    1851 
    +
    1897 int xcm_finish(struct xcm_socket *socket);
    +
    1898 
    +
    1939 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1940 
    +
    1955 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1956 
    +
    1973 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1974 
    +
    1989 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    int xcm_receive(struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    int xcm_send(struct xcm_socket *__restrict conn_socket, const void *__restrict 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_server_a(const char *local_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/latest/xcm__addr_8h.html b/api/latest/xcm__addr_8h.html new file mode 100644 index 000000000..b465d7c1c --- /dev/null +++ b/api/latest/xcm__addr_8h.html @@ -0,0 +1,1200 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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/latest/xcm__addr_8h_source.html b/api/latest/xcm__addr_8h_source.html new file mode 100644 index 000000000..b3eb73857 --- /dev/null +++ b/api/latest/xcm__addr_8h_source.html @@ -0,0 +1,208 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    46 enum 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];
    +
    65  } addr;
    +
    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 
    +
    95 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    96 
    +
    110 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    111  uint16_t *port);
    +
    112 
    +
    126 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    127  uint16_t *port);
    +
    128 
    +
    143 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    144  uint16_t *port);
    +
    145 
    +
    160 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    161  uint16_t *port);
    +
    162 
    +
    176 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    177 
    +
    191 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    192  size_t capacity);
    +
    193 
    +
    207 int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host,
    +
    208  uint16_t *port);
    +
    209 
    +
    223 int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    224  uint16_t *port);
    +
    225 
    +
    241 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    242  char *utls_addr_s, size_t capacity);
    +
    243 
    +
    259 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    260  char *tls_addr_s, size_t capacity);
    +
    261 
    +
    277 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    278  char *tcp_addr_s, size_t capacity);
    +
    279 
    +
    295 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    296  char *sctp_addr_s, size_t capacity);
    +
    297 
    +
    312 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    313 
    +
    328 int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    329 
    +
    345 int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port,
    +
    346  char *btcp_addr_s, size_t capacity);
    +
    347 
    +
    363 int 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/latest/xcm__attr_8h.html b/api/latest/xcm__attr_8h.html new file mode 100644 index 000000000..58a5ada9b --- /dev/null +++ b/api/latest/xcm__attr_8h.html @@ -0,0 +1,774 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..d974ff4b1 --- /dev/null +++ b/api/latest/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) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_double(struct xcm_socket *socket, const char *name,
    +
    89  double value);
    +
    90 
    +
    103 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    104  const char *value);
    +
    105 
    +
    131 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    132  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    133 
    +
    150 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    151  bool *value);
    +
    152 
    +
    169 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    170  int64_t *value);
    +
    171 
    +
    188 int xcm_attr_get_double(struct xcm_socket *socket, const char *name,
    +
    189  double *value);
    +
    190 
    +
    209 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    210  char *value, size_t capacity);
    +
    211 
    +
    229 int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    230  void *value, size_t capacity);
    +
    231 
    +
    233 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    234  void *value, size_t value_len, void *cb_data);
    +
    235 
    +
    249 void 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..507c2fc35 --- /dev/null +++ b/api/latest/xcm__attr__map_8h.html @@ -0,0 +1,985 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..95297c5c2 --- /dev/null +++ b/api/latest/xcm__attr__map_8h_source.html @@ -0,0 +1,211 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    23 #include <xcm_attr_types.h>
    +
    24 
    +
    25 #include <stdbool.h>
    +
    26 #include <stddef.h>
    +
    27 #include <stdint.h>
    +
    28 
    +
    29 struct xcm_attr_map;
    +
    30 
    +
    31 
    +
    37 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38 
    +
    39 
    +
    47 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48 
    +
    66 void 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 
    +
    80 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81  const char *attr_name, bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name, int64_t attr_value);
    +
    95 
    +
    96 
    +
    106 void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107  const char *attr_name, double attr_value);
    +
    108 
    +
    109 
    +
    119 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120  const char *attr_name, const char *attr_value);
    +
    121 
    +
    122 
    +
    132 void 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 
    +
    146 void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147  const struct xcm_attr_map *src_map);
    +
    148 
    +
    149 
    +
    166 const 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 
    +
    186 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187  const char *attr_name);
    +
    188 
    +
    189 
    +
    204 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205  const char *attr_name);
    +
    206 
    +
    207 
    +
    222 const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223  const char *attr_name);
    +
    224 
    +
    225 
    +
    240 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241  const char *attr_name);
    +
    242 
    +
    257 const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258  const char *attr_name);
    +
    259 
    +
    268 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269  const char *attr_name);
    +
    270 
    +
    271 
    +
    280 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281 
    +
    282 
    +
    290 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291 
    +
    292 
    +
    296 typedef 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 
    +
    315 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316  xcm_attr_map_foreach_cb cb, void *user);
    +
    317 
    +
    318 
    +
    327 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328  const struct xcm_attr_map *attr_map_b);
    +
    329 
    +
    338 void 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)
    +
    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)
    +
    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_bin(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)
    +
    const int64_t * xcm_attr_map_get_int64(const 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..d04d5d29e --- /dev/null +++ b/api/latest/xcm__attr__types_8h.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..6ab3b36c4 --- /dev/null +++ b/api/latest/xcm__attr__types_8h_source.html @@ -0,0 +1,107 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + + +
    30 };
    +
    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..888af89f3 --- /dev/null +++ b/api/latest/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..e2d44664a --- /dev/null +++ b/api/latest/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..4d4ae5f3e --- /dev/null +++ b/api/latest/xcm__version_8h.html @@ -0,0 +1,266 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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/latest/xcm__version_8h_source.html b/api/latest/xcm__version_8h_source.html new file mode 100644 index 000000000..0342d4705 --- /dev/null +++ b/api/latest/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    59 unsigned int xcm_version_major(void);
    +
    60 
    +
    67 unsigned int xcm_version_minor(void);
    +
    68 
    +
    74 unsigned int xcm_version_patch(void);
    +
    75 
    +
    84 const char *xcm_version(void);
    +
    85 
    +
    91 unsigned int xcm_version_api_major(void);
    +
    92 
    +
    98 unsigned int xcm_version_api_minor(void);
    +
    99 
    +
    108 const char *xcm_version_api(void);
    +
    109 
    +
    110 #ifdef __cplusplus
    +
    111 }
    +
    112 #endif
    +
    113 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..f2149c1dc --- /dev/null +++ b/doc/v1.0.0/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/doc/v1.0.0/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/doc/v1.0.0/bdwn.png differ diff --git a/doc/v1.0.0/classes.html b/doc/v1.0.0/classes.html new file mode 100644 index 000000000..a707aa5f9 --- /dev/null +++ b/doc/v1.0.0/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..814b5d94d --- /dev/null +++ b/doc/v1.0.0/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,97 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/doc/v1.0.0/doc.png b/doc/v1.0.0/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/doc/v1.0.0/doc.png differ diff --git a/doc/v1.0.0/doxygen.css b/doc/v1.0.0/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/doc/v1.0.0/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doc/v1.0.0/doxygen.svg b/doc/v1.0.0/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/doc/v1.0.0/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.0.0/dynsections.js b/doc/v1.0.0/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/doc/v1.0.0/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/doc/v1.0.0/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/doc/v1.0.0/folderclosed.png differ diff --git a/doc/v1.0.0/folderopen.png b/doc/v1.0.0/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/doc/v1.0.0/folderopen.png differ diff --git a/doc/v1.0.0/functions.html b/doc/v1.0.0/functions.html new file mode 100644 index 000000000..b254f0fad --- /dev/null +++ b/doc/v1.0.0/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..c4c5a109c --- /dev/null +++ b/doc/v1.0.0/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.0.0/globals.html b/doc/v1.0.0/globals.html new file mode 100644 index 000000000..601aeaa92 --- /dev/null +++ b/doc/v1.0.0/globals.html @@ -0,0 +1,221 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..f24c8a0ca --- /dev/null +++ b/doc/v1.0.0/globals_defs.html @@ -0,0 +1,111 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.0.0/globals_enum.html b/doc/v1.0.0/globals_enum.html new file mode 100644 index 000000000..c254936be --- /dev/null +++ b/doc/v1.0.0/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.0.0/globals_eval.html b/doc/v1.0.0/globals_eval.html new file mode 100644 index 000000000..d19944c7a --- /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) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.0.0/globals_func.html b/doc/v1.0.0/globals_func.html new file mode 100644 index 000000000..30965f7da --- /dev/null +++ b/doc/v1.0.0/globals_func.html @@ -0,0 +1,162 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.0.0/globals_type.html b/doc/v1.0.0/globals_type.html new file mode 100644 index 000000000..076cb8de6 --- /dev/null +++ b/doc/v1.0.0/globals_type.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + 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..0f08b4af0 --- /dev/null +++ b/doc/v1.0.0/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.0.0/group__lib__version.html b/doc/v1.0.0/group__lib__version.html new file mode 100644 index 000000000..7f0858a9b --- /dev/null +++ b/doc/v1.0.0/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.0.0/index.html b/doc/v1.0.0/index.html new file mode 100644 index 000000000..ce3b913f4 --- /dev/null +++ b/doc/v1.0.0/index.html @@ -0,0 +1,397 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/jquery.js b/doc/v1.0.0/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/doc/v1.0.0/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/doc/v1.0.0/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/doc/v1.0.0/modules.html new file mode 100644 index 000000000..75399f90c --- /dev/null +++ b/doc/v1.0.0/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/doc/v1.0.0/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..32c9e08d3 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/doc/v1.0.0/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/doc/v1.0.0/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..7130f6379 --- /dev/null +++ b/doc/v1.0.0/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.0.0/search/all_1.html b/doc/v1.0.0/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/doc/v1.0.0/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..69f82ad46 --- /dev/null +++ b/doc/v1.0.0/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.0.0/search/all_2.html b/doc/v1.0.0/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/doc/v1.0.0/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ae6e4d753 --- /dev/null +++ b/doc/v1.0.0/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.0.0/search/all_3.html b/doc/v1.0.0/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/doc/v1.0.0/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..551054f77 --- /dev/null +++ b/doc/v1.0.0/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.0.0/search/all_4.html b/doc/v1.0.0/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/doc/v1.0.0/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..fd3d5a006 --- /dev/null +++ b/doc/v1.0.0/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.0.0/search/all_5.html b/doc/v1.0.0/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/doc/v1.0.0/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..0bbcd2e51 --- /dev/null +++ b/doc/v1.0.0/search/all_5.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faddr_2eh_8',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_9',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_10',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['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_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_5ftype_28',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_29',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_30',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_31',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_32',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_33',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['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_5fcompat_2eh_37',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_38',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5ffd_39',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_40',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_41',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_42',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_43',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_44',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_45',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_46',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_47',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_48',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_49',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_50',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_51',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fset_5fblocking_52',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_53',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_54',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_55',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_56',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_57',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_58',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_59',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_60',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_61',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.0.0/search/all_6.html b/doc/v1.0.0/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/doc/v1.0.0/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5debab10e --- /dev/null +++ b/doc/v1.0.0/search/all_6.js @@ -0,0 +1,119 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_14',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_15',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_16',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_17',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_18',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_19',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_20',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_21',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_22',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_23',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_24',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_25',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_26',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_27',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_28',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_29',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_30',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_31',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_32',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_33',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_34',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_35',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_36',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_37',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_38',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_39',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_40',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_41',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_51',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_59',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_60',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_61',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_62',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_63',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_84',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',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#a4d8d62a9625b49993b7d6ec03de8e765',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#ad52a0d86b7b5bf802835758cc9251e2e',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#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_98',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',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',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_109',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_110',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_111',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_112',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_113',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_114',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_115',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_116',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_117',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_118',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_119',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_120',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_121',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_122',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_123',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.0.0/search/classes_0.html b/doc/v1.0.0/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/doc/v1.0.0/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..3fd236c7f --- /dev/null +++ b/doc/v1.0.0/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_62',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_63',['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..a933eea1a --- /dev/null +++ b/doc/v1.0.0/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/doc/v1.0.0/search/defines_0.html b/doc/v1.0.0/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/doc/v1.0.0/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..a38c2a914 --- /dev/null +++ b/doc/v1.0.0/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_110',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_111',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_112',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_113',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_114',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_115',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_116',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_117',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_118',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_119',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_120',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_121',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_122',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.0.0/search/enums_0.html b/doc/v1.0.0/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/doc/v1.0.0/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..e9cd8553d --- /dev/null +++ b/doc/v1.0.0/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_105',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.0.0/search/enumvalues_0.html b/doc/v1.0.0/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/doc/v1.0.0/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..dd5198a0a --- /dev/null +++ b/doc/v1.0.0/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_106',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_107',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_108',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_109',['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.html b/doc/v1.0.0/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/doc/v1.0.0/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..bdcb0b319 --- /dev/null +++ b/doc/v1.0.0/search/files_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_2eh_64',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_65',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_66',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_67',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_68',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/doc/v1.0.0/search/functions_0.html b/doc/v1.0.0/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/doc/v1.0.0/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5feca713e --- /dev/null +++ b/doc/v1.0.0/search/functions_0.js @@ -0,0 +1,33 @@ +var searchData= +[ + ['xcm_5faccept_69',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_70',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_71',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_72',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_73',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_74',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_75',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_76',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_77',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_78',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_79',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_80',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_81',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_82',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_83',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_84',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fawait_85',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_86',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_87',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_88',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5ffd_89',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_90',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_91',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_92',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_93',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_94',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_95',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_96',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fset_5fblocking_97',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_98',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.0.0/search/groups_0.html b/doc/v1.0.0/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/doc/v1.0.0/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ee66bd8d9 --- /dev/null +++ b/doc/v1.0.0/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_238',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.0.0/search/groups_1.html b/doc/v1.0.0/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/doc/v1.0.0/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..73d61cda3 --- /dev/null +++ b/doc/v1.0.0/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_239',['Library Version',['../group__lib__version.html',1,'']]] +]; 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..03626f64a --- /dev/null +++ b/doc/v1.0.0/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/doc/v1.0.0/search/nomatches.html b/doc/v1.0.0/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/doc/v1.0.0/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/doc/v1.0.0/search/pages_0.html b/doc/v1.0.0/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/doc/v1.0.0/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..d54e25172 --- /dev/null +++ b/doc/v1.0.0/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_123',['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..9074198f8 --- /dev/null +++ b/doc/v1.0.0/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/doc/v1.0.0/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.0.0/search/typedefs_0.js b/doc/v1.0.0/search/typedefs_0.js new file mode 100644 index 000000000..94a35a004 --- /dev/null +++ b/doc/v1.0.0/search/typedefs_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_104',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]] +]; diff --git a/doc/v1.0.0/search/variables_0.html b/doc/v1.0.0/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/doc/v1.0.0/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.0.0/search/variables_0.js b/doc/v1.0.0/search/variables_0.js new file mode 100644 index 000000000..0512351e5 --- /dev/null +++ b/doc/v1.0.0/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_99',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.0.0/search/variables_1.html b/doc/v1.0.0/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/doc/v1.0.0/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.0.0/search/variables_1.js b/doc/v1.0.0/search/variables_1.js new file mode 100644 index 000000000..73597899a --- /dev/null +++ b/doc/v1.0.0/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_100',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.0.0/search/variables_2.html b/doc/v1.0.0/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/doc/v1.0.0/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.0.0/search/variables_2.js b/doc/v1.0.0/search/variables_2.js new file mode 100644 index 000000000..2fdf2b559 --- /dev/null +++ b/doc/v1.0.0/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_101',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_102',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.0.0/search/variables_3.html b/doc/v1.0.0/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/doc/v1.0.0/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.0.0/search/variables_3.js b/doc/v1.0.0/search/variables_3.js new file mode 100644 index 000000000..3b36e896b --- /dev/null +++ b/doc/v1.0.0/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_103',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.0.0/server_accept.png b/doc/v1.0.0/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/doc/v1.0.0/server_accept.png differ diff --git a/doc/v1.0.0/splitbar.png b/doc/v1.0.0/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/doc/v1.0.0/splitbar.png differ diff --git a/doc/v1.0.0/structxcm__addr__host.html b/doc/v1.0.0/structxcm__addr__host.html new file mode 100644 index 000000000..fd0161c24 --- /dev/null +++ b/doc/v1.0.0/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..b7efd4151 --- /dev/null +++ b/doc/v1.0.0/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/doc/v1.0.0/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/doc/v1.0.0/xcm_8h.html b/doc/v1.0.0/xcm_8h.html new file mode 100644 index 000000000..3564eb8fe --- /dev/null +++ b/doc/v1.0.0/xcm_8h.html @@ -0,0 +1,775 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..f8c604999 --- /dev/null +++ b/doc/v1.0.0/xcm_8h_source.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    958 struct xcm_socket;
    +
    959 
    +
    1010 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1011 
    +
    1042 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1043 
    +
    1060 int xcm_close(struct xcm_socket *socket);
    +
    1061 
    +
    1081 void xcm_cleanup(struct xcm_socket *socket);
    +
    1082 
    +
    1105 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1106 
    +
    1128 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1129 
    +
    1152 int 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 
    +
    1223 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1224 
    +
    1266 int xcm_fd(struct xcm_socket *socket);
    +
    1267 
    +
    1308 int xcm_finish(struct xcm_socket *socket);
    +
    1309 
    +
    1347 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1348 
    +
    1360 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1361 
    +
    1375 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1376 
    +
    1386 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    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..57a195e64 --- /dev/null +++ b/doc/v1.0.0/xcm__addr_8h.html @@ -0,0 +1,940 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..064342ffe --- /dev/null +++ b/doc/v1.0.0/xcm__addr_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    39 enum 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];
    +
    58  } addr;
    +
    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 
    +
    88 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89 
    +
    103 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104  uint16_t *port);
    +
    105 
    +
    119 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120  uint16_t *port);
    +
    121 
    +
    136 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137  uint16_t *port);
    +
    138 
    +
    153 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154  uint16_t *port);
    +
    155 
    +
    169 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170 
    +
    184 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185  size_t capacity);
    +
    186 
    +
    202 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203  char *utls_addr_s, size_t capacity);
    +
    204 
    +
    220 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221  char *tls_addr_s, size_t capacity);
    +
    222 
    +
    238 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239  char *tcp_addr_s, size_t capacity);
    +
    240 
    +
    256 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257  char *sctp_addr_s, size_t capacity);
    +
    258 
    +
    273 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274 
    +
    289 int 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..7d0ed6a2b --- /dev/null +++ b/doc/v1.0.0/xcm__attr_8h.html @@ -0,0 +1,234 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..253e2de87 --- /dev/null +++ b/doc/v1.0.0/xcm__attr_8h_source.html @@ -0,0 +1,111 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <xcm.h>
    +
    19 #include <xcm_attr_types.h>
    +
    20 #include <stdbool.h>
    +
    21 
    +
    46 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    47  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    48 
    +
    50 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    51  void *value, size_t value_len, void *cb_data);
    +
    52 
    +
    66 void 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..b1bcba7c2 --- /dev/null +++ b/doc/v1.0.0/xcm__attr__map_8h.html @@ -0,0 +1,985 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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.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..759c9da94 --- /dev/null +++ b/doc/v1.0.0/xcm__attr__map_8h_source.html @@ -0,0 +1,211 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    23 #include <xcm_attr_types.h>
    +
    24 
    +
    25 #include <stdbool.h>
    +
    26 #include <stddef.h>
    +
    27 #include <stdint.h>
    +
    28 
    +
    29 struct xcm_attr_map;
    +
    30 
    +
    31 
    +
    37 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38 
    +
    39 
    +
    47 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48 
    +
    66 void 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 
    +
    80 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81  const char *attr_name, bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name, int64_t attr_value);
    +
    95 
    +
    96 
    +
    106 void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107  const char *attr_name, double attr_value);
    +
    108 
    +
    109 
    +
    119 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120  const char *attr_name, const char *attr_value);
    +
    121 
    +
    122 
    +
    132 void 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 
    +
    146 void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147  const struct xcm_attr_map *src_map);
    +
    148 
    +
    149 
    +
    166 const 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 
    +
    186 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187  const char *attr_name);
    +
    188 
    +
    189 
    +
    204 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205  const char *attr_name);
    +
    206 
    +
    207 
    +
    222 const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223  const char *attr_name);
    +
    224 
    +
    225 
    +
    240 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241  const char *attr_name);
    +
    242 
    +
    257 const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258  const char *attr_name);
    +
    259 
    +
    268 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269  const char *attr_name);
    +
    270 
    +
    271 
    +
    280 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281 
    +
    282 
    +
    290 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291 
    +
    292 
    +
    296 typedef 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 
    +
    315 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316  xcm_attr_map_foreach_cb cb, void *user);
    +
    317 
    +
    318 
    +
    327 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328  const struct xcm_attr_map *attr_map_b);
    +
    329 
    +
    338 void 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)
    +
    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)
    +
    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_bin(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)
    +
    const int64_t * xcm_attr_map_get_int64(const 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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__types_8h.html b/doc/v1.0.0/xcm__attr__types_8h.html new file mode 100644 index 000000000..95c0b096b --- /dev/null +++ b/doc/v1.0.0/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..85d5a6b39 --- /dev/null +++ b/doc/v1.0.0/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..6b15c1afd --- /dev/null +++ b/doc/v1.0.0/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..35440f3c3 --- /dev/null +++ b/doc/v1.0.0/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    118 int 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..0a0a42a26 --- /dev/null +++ b/doc/v1.0.0/xcm__version_8h.html @@ -0,0 +1,266 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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.0.0/xcm__version_8h_source.html b/doc/v1.0.0/xcm__version_8h_source.html new file mode 100644 index 000000000..7a01da1e9 --- /dev/null +++ b/doc/v1.0.0/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    59 unsigned int xcm_version_major(void);
    +
    60 
    +
    67 unsigned int xcm_version_minor(void);
    +
    68 
    +
    74 unsigned int xcm_version_patch(void);
    +
    75 
    +
    84 const char *xcm_version(void);
    +
    85 
    +
    91 unsigned int xcm_version_api_major(void);
    +
    92 
    +
    98 unsigned int xcm_version_api_minor(void);
    +
    99 
    +
    108 const char *xcm_version_api(void);
    +
    109 
    +
    110 #ifdef __cplusplus
    +
    111 }
    +
    112 #endif
    +
    113 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..fa89c8c8d --- /dev/null +++ b/doc/v1.0.1/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/doc/v1.0.1/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/doc/v1.0.1/bdwn.png differ diff --git a/doc/v1.0.1/classes.html b/doc/v1.0.1/classes.html new file mode 100644 index 000000000..07e859521 --- /dev/null +++ b/doc/v1.0.1/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..92615162f --- /dev/null +++ b/doc/v1.0.1/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,97 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/doc/v1.0.1/doc.png b/doc/v1.0.1/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/doc/v1.0.1/doc.png differ diff --git a/doc/v1.0.1/doxygen.css b/doc/v1.0.1/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/doc/v1.0.1/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doc/v1.0.1/doxygen.svg b/doc/v1.0.1/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/doc/v1.0.1/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.0.1/dynsections.js b/doc/v1.0.1/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/doc/v1.0.1/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/doc/v1.0.1/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/doc/v1.0.1/folderclosed.png differ diff --git a/doc/v1.0.1/folderopen.png b/doc/v1.0.1/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/doc/v1.0.1/folderopen.png differ diff --git a/doc/v1.0.1/functions.html b/doc/v1.0.1/functions.html new file mode 100644 index 000000000..a3e474a40 --- /dev/null +++ b/doc/v1.0.1/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..05cfbc3d1 --- /dev/null +++ b/doc/v1.0.1/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.0.1/globals.html b/doc/v1.0.1/globals.html new file mode 100644 index 000000000..6296e7b2c --- /dev/null +++ b/doc/v1.0.1/globals.html @@ -0,0 +1,221 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..796a55097 --- /dev/null +++ b/doc/v1.0.1/globals_defs.html @@ -0,0 +1,111 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.0.1/globals_enum.html b/doc/v1.0.1/globals_enum.html new file mode 100644 index 000000000..ea71bf37a --- /dev/null +++ b/doc/v1.0.1/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.0.1/globals_eval.html b/doc/v1.0.1/globals_eval.html new file mode 100644 index 000000000..166d04765 --- /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) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.0.1/globals_func.html b/doc/v1.0.1/globals_func.html new file mode 100644 index 000000000..2f4594331 --- /dev/null +++ b/doc/v1.0.1/globals_func.html @@ -0,0 +1,162 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.0.1/globals_type.html b/doc/v1.0.1/globals_type.html new file mode 100644 index 000000000..dc3bdf791 --- /dev/null +++ b/doc/v1.0.1/globals_type.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + 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..0f08b4af0 --- /dev/null +++ b/doc/v1.0.1/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.0.1/group__lib__version.html b/doc/v1.0.1/group__lib__version.html new file mode 100644 index 000000000..7f0858a9b --- /dev/null +++ b/doc/v1.0.1/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.0.1/index.html b/doc/v1.0.1/index.html new file mode 100644 index 000000000..eae388f1b --- /dev/null +++ b/doc/v1.0.1/index.html @@ -0,0 +1,397 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/jquery.js b/doc/v1.0.1/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/doc/v1.0.1/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/doc/v1.0.1/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/doc/v1.0.1/modules.html new file mode 100644 index 000000000..75399f90c --- /dev/null +++ b/doc/v1.0.1/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/doc/v1.0.1/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..32c9e08d3 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/doc/v1.0.1/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/doc/v1.0.1/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..7130f6379 --- /dev/null +++ b/doc/v1.0.1/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.0.1/search/all_1.html b/doc/v1.0.1/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/doc/v1.0.1/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..69f82ad46 --- /dev/null +++ b/doc/v1.0.1/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.0.1/search/all_2.html b/doc/v1.0.1/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/doc/v1.0.1/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ae6e4d753 --- /dev/null +++ b/doc/v1.0.1/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.0.1/search/all_3.html b/doc/v1.0.1/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/doc/v1.0.1/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..551054f77 --- /dev/null +++ b/doc/v1.0.1/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.0.1/search/all_4.html b/doc/v1.0.1/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/doc/v1.0.1/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..fd3d5a006 --- /dev/null +++ b/doc/v1.0.1/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.0.1/search/all_5.html b/doc/v1.0.1/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/doc/v1.0.1/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..0bbcd2e51 --- /dev/null +++ b/doc/v1.0.1/search/all_5.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faddr_2eh_8',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_9',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_10',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['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_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_5ftype_28',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_29',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_30',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_31',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_32',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_33',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['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_5fcompat_2eh_37',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_38',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5ffd_39',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_40',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_41',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_42',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_43',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_44',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_45',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_46',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_47',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_48',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_49',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_50',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_51',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fset_5fblocking_52',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_53',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_54',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_55',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_56',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_57',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_58',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_59',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_60',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_61',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.0.1/search/all_6.html b/doc/v1.0.1/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/doc/v1.0.1/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5debab10e --- /dev/null +++ b/doc/v1.0.1/search/all_6.js @@ -0,0 +1,119 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_14',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_15',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_16',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_17',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_18',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_19',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_20',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_21',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_22',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_23',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_24',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_25',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_26',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_27',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_28',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_29',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_30',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_31',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_32',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_33',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_34',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_35',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_36',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_37',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_38',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_39',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_40',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_41',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_51',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_59',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_60',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_61',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_62',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_63',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_84',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',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#a4d8d62a9625b49993b7d6ec03de8e765',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#ad52a0d86b7b5bf802835758cc9251e2e',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#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_98',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',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',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_109',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_110',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_111',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_112',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_113',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_114',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_115',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_116',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_117',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_118',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_119',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_120',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_121',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_122',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_123',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.0.1/search/classes_0.html b/doc/v1.0.1/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/doc/v1.0.1/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..3fd236c7f --- /dev/null +++ b/doc/v1.0.1/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_62',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_63',['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..a933eea1a --- /dev/null +++ b/doc/v1.0.1/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/doc/v1.0.1/search/defines_0.html b/doc/v1.0.1/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/doc/v1.0.1/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..a38c2a914 --- /dev/null +++ b/doc/v1.0.1/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_110',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_111',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_112',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_113',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_114',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_115',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_116',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_117',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_118',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_119',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_120',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_121',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_122',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.0.1/search/enums_0.html b/doc/v1.0.1/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/doc/v1.0.1/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..e9cd8553d --- /dev/null +++ b/doc/v1.0.1/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_105',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.0.1/search/enumvalues_0.html b/doc/v1.0.1/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/doc/v1.0.1/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..dd5198a0a --- /dev/null +++ b/doc/v1.0.1/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_106',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_107',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_108',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_109',['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.html b/doc/v1.0.1/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/doc/v1.0.1/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..bdcb0b319 --- /dev/null +++ b/doc/v1.0.1/search/files_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_2eh_64',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_65',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_66',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_67',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_68',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/doc/v1.0.1/search/functions_0.html b/doc/v1.0.1/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/doc/v1.0.1/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5feca713e --- /dev/null +++ b/doc/v1.0.1/search/functions_0.js @@ -0,0 +1,33 @@ +var searchData= +[ + ['xcm_5faccept_69',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_70',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_71',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_72',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_73',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_74',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_75',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_76',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_77',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_78',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_79',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_80',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_81',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_82',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_83',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_84',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fawait_85',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_86',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_87',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_88',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5ffd_89',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_90',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_91',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_92',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_93',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_94',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_95',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_96',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fset_5fblocking_97',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_98',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.0.1/search/groups_0.html b/doc/v1.0.1/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/doc/v1.0.1/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ee66bd8d9 --- /dev/null +++ b/doc/v1.0.1/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_238',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.0.1/search/groups_1.html b/doc/v1.0.1/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/doc/v1.0.1/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..73d61cda3 --- /dev/null +++ b/doc/v1.0.1/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_239',['Library Version',['../group__lib__version.html',1,'']]] +]; 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..03626f64a --- /dev/null +++ b/doc/v1.0.1/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/doc/v1.0.1/search/nomatches.html b/doc/v1.0.1/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/doc/v1.0.1/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/doc/v1.0.1/search/pages_0.html b/doc/v1.0.1/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/doc/v1.0.1/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..d54e25172 --- /dev/null +++ b/doc/v1.0.1/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_123',['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..9074198f8 --- /dev/null +++ b/doc/v1.0.1/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/doc/v1.0.1/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.0.1/search/typedefs_0.js b/doc/v1.0.1/search/typedefs_0.js new file mode 100644 index 000000000..94a35a004 --- /dev/null +++ b/doc/v1.0.1/search/typedefs_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_104',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]] +]; diff --git a/doc/v1.0.1/search/variables_0.html b/doc/v1.0.1/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/doc/v1.0.1/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.0.1/search/variables_0.js b/doc/v1.0.1/search/variables_0.js new file mode 100644 index 000000000..0512351e5 --- /dev/null +++ b/doc/v1.0.1/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_99',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.0.1/search/variables_1.html b/doc/v1.0.1/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/doc/v1.0.1/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.0.1/search/variables_1.js b/doc/v1.0.1/search/variables_1.js new file mode 100644 index 000000000..73597899a --- /dev/null +++ b/doc/v1.0.1/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_100',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.0.1/search/variables_2.html b/doc/v1.0.1/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/doc/v1.0.1/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.0.1/search/variables_2.js b/doc/v1.0.1/search/variables_2.js new file mode 100644 index 000000000..2fdf2b559 --- /dev/null +++ b/doc/v1.0.1/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_101',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_102',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.0.1/search/variables_3.html b/doc/v1.0.1/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/doc/v1.0.1/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.0.1/search/variables_3.js b/doc/v1.0.1/search/variables_3.js new file mode 100644 index 000000000..3b36e896b --- /dev/null +++ b/doc/v1.0.1/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_103',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.0.1/server_accept.png b/doc/v1.0.1/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/doc/v1.0.1/server_accept.png differ diff --git a/doc/v1.0.1/splitbar.png b/doc/v1.0.1/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/doc/v1.0.1/splitbar.png differ diff --git a/doc/v1.0.1/structxcm__addr__host.html b/doc/v1.0.1/structxcm__addr__host.html new file mode 100644 index 000000000..345110e73 --- /dev/null +++ b/doc/v1.0.1/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..36e224d2e --- /dev/null +++ b/doc/v1.0.1/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/doc/v1.0.1/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/doc/v1.0.1/xcm_8h.html b/doc/v1.0.1/xcm_8h.html new file mode 100644 index 000000000..d6f8e7f99 --- /dev/null +++ b/doc/v1.0.1/xcm_8h.html @@ -0,0 +1,775 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..4d945ee84 --- /dev/null +++ b/doc/v1.0.1/xcm_8h_source.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    958 struct xcm_socket;
    +
    959 
    +
    1010 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1011 
    +
    1042 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1043 
    +
    1060 int xcm_close(struct xcm_socket *socket);
    +
    1061 
    +
    1081 void xcm_cleanup(struct xcm_socket *socket);
    +
    1082 
    +
    1105 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1106 
    +
    1128 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1129 
    +
    1152 int 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 
    +
    1223 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1224 
    +
    1266 int xcm_fd(struct xcm_socket *socket);
    +
    1267 
    +
    1308 int xcm_finish(struct xcm_socket *socket);
    +
    1309 
    +
    1347 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1348 
    +
    1360 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1361 
    +
    1375 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1376 
    +
    1386 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    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..5f9557d94 --- /dev/null +++ b/doc/v1.0.1/xcm__addr_8h.html @@ -0,0 +1,940 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..2f97f192f --- /dev/null +++ b/doc/v1.0.1/xcm__addr_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    39 enum 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];
    +
    58  } addr;
    +
    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 
    +
    88 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89 
    +
    103 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104  uint16_t *port);
    +
    105 
    +
    119 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120  uint16_t *port);
    +
    121 
    +
    136 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137  uint16_t *port);
    +
    138 
    +
    153 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154  uint16_t *port);
    +
    155 
    +
    169 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170 
    +
    184 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185  size_t capacity);
    +
    186 
    +
    202 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203  char *utls_addr_s, size_t capacity);
    +
    204 
    +
    220 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221  char *tls_addr_s, size_t capacity);
    +
    222 
    +
    238 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239  char *tcp_addr_s, size_t capacity);
    +
    240 
    +
    256 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257  char *sctp_addr_s, size_t capacity);
    +
    258 
    +
    273 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274 
    +
    289 int 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..bb4128f8a --- /dev/null +++ b/doc/v1.0.1/xcm__attr_8h.html @@ -0,0 +1,234 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..d77f92e45 --- /dev/null +++ b/doc/v1.0.1/xcm__attr_8h_source.html @@ -0,0 +1,111 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <xcm.h>
    +
    19 #include <xcm_attr_types.h>
    +
    20 #include <stdbool.h>
    +
    21 
    +
    46 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    47  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    48 
    +
    50 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    51  void *value, size_t value_len, void *cb_data);
    +
    52 
    +
    66 void 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..b1bcba7c2 --- /dev/null +++ b/doc/v1.0.1/xcm__attr__map_8h.html @@ -0,0 +1,985 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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.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..759c9da94 --- /dev/null +++ b/doc/v1.0.1/xcm__attr__map_8h_source.html @@ -0,0 +1,211 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    23 #include <xcm_attr_types.h>
    +
    24 
    +
    25 #include <stdbool.h>
    +
    26 #include <stddef.h>
    +
    27 #include <stdint.h>
    +
    28 
    +
    29 struct xcm_attr_map;
    +
    30 
    +
    31 
    +
    37 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38 
    +
    39 
    +
    47 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48 
    +
    66 void 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 
    +
    80 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81  const char *attr_name, bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name, int64_t attr_value);
    +
    95 
    +
    96 
    +
    106 void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107  const char *attr_name, double attr_value);
    +
    108 
    +
    109 
    +
    119 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120  const char *attr_name, const char *attr_value);
    +
    121 
    +
    122 
    +
    132 void 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 
    +
    146 void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147  const struct xcm_attr_map *src_map);
    +
    148 
    +
    149 
    +
    166 const 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 
    +
    186 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187  const char *attr_name);
    +
    188 
    +
    189 
    +
    204 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205  const char *attr_name);
    +
    206 
    +
    207 
    +
    222 const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223  const char *attr_name);
    +
    224 
    +
    225 
    +
    240 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241  const char *attr_name);
    +
    242 
    +
    257 const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258  const char *attr_name);
    +
    259 
    +
    268 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269  const char *attr_name);
    +
    270 
    +
    271 
    +
    280 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281 
    +
    282 
    +
    290 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291 
    +
    292 
    +
    296 typedef 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 
    +
    315 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316  xcm_attr_map_foreach_cb cb, void *user);
    +
    317 
    +
    318 
    +
    327 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328  const struct xcm_attr_map *attr_map_b);
    +
    329 
    +
    338 void 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)
    +
    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)
    +
    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_bin(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)
    +
    const int64_t * xcm_attr_map_get_int64(const 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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__types_8h.html b/doc/v1.0.1/xcm__attr__types_8h.html new file mode 100644 index 000000000..d7ba59171 --- /dev/null +++ b/doc/v1.0.1/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..4a5337ca8 --- /dev/null +++ b/doc/v1.0.1/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..02beee420 --- /dev/null +++ b/doc/v1.0.1/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..cdbf35a6a --- /dev/null +++ b/doc/v1.0.1/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    118 int 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..0a0a42a26 --- /dev/null +++ b/doc/v1.0.1/xcm__version_8h.html @@ -0,0 +1,266 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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.0.1/xcm__version_8h_source.html b/doc/v1.0.1/xcm__version_8h_source.html new file mode 100644 index 000000000..7a01da1e9 --- /dev/null +++ b/doc/v1.0.1/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    59 unsigned int xcm_version_major(void);
    +
    60 
    +
    67 unsigned int xcm_version_minor(void);
    +
    68 
    +
    74 unsigned int xcm_version_patch(void);
    +
    75 
    +
    84 const char *xcm_version(void);
    +
    85 
    +
    91 unsigned int xcm_version_api_major(void);
    +
    92 
    +
    98 unsigned int xcm_version_api_minor(void);
    +
    99 
    +
    108 const char *xcm_version_api(void);
    +
    109 
    +
    110 #ifdef __cplusplus
    +
    111 }
    +
    112 #endif
    +
    113 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..9748b1103 --- /dev/null +++ b/doc/v1.1.0/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/doc/v1.1.0/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/doc/v1.1.0/bdwn.png differ diff --git a/doc/v1.1.0/classes.html b/doc/v1.1.0/classes.html new file mode 100644 index 000000000..363af00e4 --- /dev/null +++ b/doc/v1.1.0/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..5f847a944 --- /dev/null +++ b/doc/v1.1.0/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,100 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/doc/v1.1.0/doc.png b/doc/v1.1.0/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/doc/v1.1.0/doc.png differ diff --git a/doc/v1.1.0/doxygen.css b/doc/v1.1.0/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/doc/v1.1.0/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doc/v1.1.0/doxygen.svg b/doc/v1.1.0/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/doc/v1.1.0/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.1.0/dynsections.js b/doc/v1.1.0/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/doc/v1.1.0/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/doc/v1.1.0/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/doc/v1.1.0/folderclosed.png differ diff --git a/doc/v1.1.0/folderopen.png b/doc/v1.1.0/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/doc/v1.1.0/folderopen.png differ diff --git a/doc/v1.1.0/functions.html b/doc/v1.1.0/functions.html new file mode 100644 index 000000000..6e6c8f593 --- /dev/null +++ b/doc/v1.1.0/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..ab7c81933 --- /dev/null +++ b/doc/v1.1.0/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.1.0/globals.html b/doc/v1.1.0/globals.html new file mode 100644 index 000000000..3ed7fa860 --- /dev/null +++ b/doc/v1.1.0/globals.html @@ -0,0 +1,302 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..9ad84a59e --- /dev/null +++ b/doc/v1.1.0/globals_defs.html @@ -0,0 +1,111 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.1.0/globals_enum.html b/doc/v1.1.0/globals_enum.html new file mode 100644 index 000000000..e205fc910 --- /dev/null +++ b/doc/v1.1.0/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.1.0/globals_eval.html b/doc/v1.1.0/globals_eval.html new file mode 100644 index 000000000..9533dcf35 --- /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) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.1.0/globals_func.html b/doc/v1.1.0/globals_func.html new file mode 100644 index 000000000..852cf6b14 --- /dev/null +++ b/doc/v1.1.0/globals_func.html @@ -0,0 +1,242 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - 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..ebfa7e1bb --- /dev/null +++ b/doc/v1.1.0/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + 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..0f08b4af0 --- /dev/null +++ b/doc/v1.1.0/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.1.0/group__lib__version.html b/doc/v1.1.0/group__lib__version.html new file mode 100644 index 000000000..7f0858a9b --- /dev/null +++ b/doc/v1.1.0/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.1.0/index.html b/doc/v1.1.0/index.html new file mode 100644 index 000000000..5116978b4 --- /dev/null +++ b/doc/v1.1.0/index.html @@ -0,0 +1,502 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/doc/v1.1.0/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/doc/v1.1.0/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/doc/v1.1.0/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/doc/v1.1.0/modules.html new file mode 100644 index 000000000..75399f90c --- /dev/null +++ b/doc/v1.1.0/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/doc/v1.1.0/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..32c9e08d3 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/doc/v1.1.0/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/doc/v1.1.0/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..7130f6379 --- /dev/null +++ b/doc/v1.1.0/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.1.0/search/all_1.html b/doc/v1.1.0/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/doc/v1.1.0/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..69f82ad46 --- /dev/null +++ b/doc/v1.1.0/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.1.0/search/all_2.html b/doc/v1.1.0/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/doc/v1.1.0/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ae6e4d753 --- /dev/null +++ b/doc/v1.1.0/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.1.0/search/all_3.html b/doc/v1.1.0/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/doc/v1.1.0/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..551054f77 --- /dev/null +++ b/doc/v1.1.0/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.1.0/search/all_4.html b/doc/v1.1.0/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/doc/v1.1.0/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..fd3d5a006 --- /dev/null +++ b/doc/v1.1.0/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.1.0/search/all_5.html b/doc/v1.1.0/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/doc/v1.1.0/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..417ba458b --- /dev/null +++ b/doc/v1.1.0/search/all_5.js @@ -0,0 +1,87 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_8',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_9',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_10',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_11',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_12',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_13',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_14',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_15',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_16',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_17',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_18',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_19',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_20',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_21',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_22',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_23',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_24',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_25',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_26',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_27',['xcm_attr_get',['../xcm__attr_8h.html#a225a543ef40cbfa5da1c860cfbcb4152',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_28',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_29',['xcm_attr_get_bool',['../xcm__attr_8h.html#af56192a489902f0b672f9d80f727c6db',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_30',['xcm_attr_get_int64',['../xcm__attr_8h.html#a9dc368c8e5800c6427935d5031d377bd',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_31',['xcm_attr_get_str',['../xcm__attr_8h.html#aaae1fd6d48381a5c6b3f301aa93e0db4',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_32',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_33',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_38',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_46',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_47',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_48',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_49',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_50',['xcm_attr_set',['../xcm__attr_8h.html#a24fc9562ced814651160a5783ddb21c7',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_51',['xcm_attr_set_bool',['../xcm__attr_8h.html#ac8033ada81b2a404a803c2d651b2ba60',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_52',['xcm_attr_set_int64',['../xcm__attr_8h.html#a04fd6fe3d498515a5d4979b2bbb42c83',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_53',['xcm_attr_set_str',['../xcm__attr_8h.html#afb84c5dbcc633d9827ab07bd25d5bbd2',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_54',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_55',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_56',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_57',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_58',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_59',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_60',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_61',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_62',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_63',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_64',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_65',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_66',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_67',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_68',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_69',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_70',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_71',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_72',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_73',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_74',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_75',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_76',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_77',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_78',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_79',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_80',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_81',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_82',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_83',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_84',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_85',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_86',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_87',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_88',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_89',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.1.0/search/all_6.html b/doc/v1.1.0/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/doc/v1.1.0/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5debab10e --- /dev/null +++ b/doc/v1.1.0/search/all_6.js @@ -0,0 +1,119 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_14',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_15',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_16',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_17',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_18',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_19',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_20',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_21',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_22',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_23',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_24',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_25',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_26',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_27',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_28',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_29',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_30',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_31',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_32',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_33',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_34',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_35',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_36',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_37',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_38',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_39',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_40',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_41',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_51',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_59',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_60',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_61',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_62',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_63',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_84',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',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#a4d8d62a9625b49993b7d6ec03de8e765',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#ad52a0d86b7b5bf802835758cc9251e2e',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#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_98',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',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',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_109',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_110',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_111',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_112',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_113',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_114',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_115',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_116',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_117',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_118',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_119',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_120',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_121',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_122',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_123',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.1.0/search/classes_0.html b/doc/v1.1.0/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/doc/v1.1.0/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..468741d24 --- /dev/null +++ b/doc/v1.1.0/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_90',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_91',['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..a933eea1a --- /dev/null +++ b/doc/v1.1.0/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/doc/v1.1.0/search/defines_0.html b/doc/v1.1.0/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/doc/v1.1.0/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ed9b81242 --- /dev/null +++ b/doc/v1.1.0/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_166',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_167',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_168',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_169',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_170',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_171',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_172',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_173',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_174',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_175',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_176',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_177',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_178',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.1.0/search/enums_0.html b/doc/v1.1.0/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/doc/v1.1.0/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..623970eaa --- /dev/null +++ b/doc/v1.1.0/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_161',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.1.0/search/enumvalues_0.html b/doc/v1.1.0/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/doc/v1.1.0/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..bf116ee08 --- /dev/null +++ b/doc/v1.1.0/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_162',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_163',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_164',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_165',['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.html b/doc/v1.1.0/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/doc/v1.1.0/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..d46f54089 --- /dev/null +++ b/doc/v1.1.0/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_92',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_93',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_94',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_95',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_96',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_97',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/doc/v1.1.0/search/functions_0.html b/doc/v1.1.0/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/doc/v1.1.0/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..20a45e4fd --- /dev/null +++ b/doc/v1.1.0/search/functions_0.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['xcm_5faccept_98',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_99',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_100',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_101',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_102',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_103',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_104',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_105',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_106',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_107',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_108',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_109',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_110',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_111',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_112',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_113',['xcm_attr_get',['../xcm__attr_8h.html#a225a543ef40cbfa5da1c860cfbcb4152',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_114',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_115',['xcm_attr_get_bool',['../xcm__attr_8h.html#af56192a489902f0b672f9d80f727c6db',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_116',['xcm_attr_get_int64',['../xcm__attr_8h.html#a9dc368c8e5800c6427935d5031d377bd',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_117',['xcm_attr_get_str',['../xcm__attr_8h.html#aaae1fd6d48381a5c6b3f301aa93e0db4',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_118',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_119',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_120',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_121',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_122',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_123',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_124',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_125',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_126',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_127',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_128',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_129',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_130',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_131',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_132',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_133',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_134',['xcm_attr_set',['../xcm__attr_8h.html#a24fc9562ced814651160a5783ddb21c7',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_135',['xcm_attr_set_bool',['../xcm__attr_8h.html#ac8033ada81b2a404a803c2d651b2ba60',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_136',['xcm_attr_set_int64',['../xcm__attr_8h.html#a04fd6fe3d498515a5d4979b2bbb42c83',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_137',['xcm_attr_set_str',['../xcm__attr_8h.html#afb84c5dbcc633d9827ab07bd25d5bbd2',1,'xcm_attr.h']]], + ['xcm_5fawait_138',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_139',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_140',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_141',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_142',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_143',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_144',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_145',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_146',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_147',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_148',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_149',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_150',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_151',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_152',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_153',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.1.0/search/groups_0.html b/doc/v1.1.0/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/doc/v1.1.0/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ee66bd8d9 --- /dev/null +++ b/doc/v1.1.0/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_238',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.1.0/search/groups_1.html b/doc/v1.1.0/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/doc/v1.1.0/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..73d61cda3 --- /dev/null +++ b/doc/v1.1.0/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_239',['Library Version',['../group__lib__version.html',1,'']]] +]; 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..03626f64a --- /dev/null +++ b/doc/v1.1.0/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/doc/v1.1.0/search/nomatches.html b/doc/v1.1.0/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/doc/v1.1.0/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/doc/v1.1.0/search/pages_0.html b/doc/v1.1.0/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/doc/v1.1.0/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..c122886e8 --- /dev/null +++ b/doc/v1.1.0/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_179',['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..9074198f8 --- /dev/null +++ b/doc/v1.1.0/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/doc/v1.1.0/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.1.0/search/typedefs_0.js b/doc/v1.1.0/search/typedefs_0.js new file mode 100644 index 000000000..c9347964e --- /dev/null +++ b/doc/v1.1.0/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_159',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_160',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/doc/v1.1.0/search/variables_0.html b/doc/v1.1.0/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/doc/v1.1.0/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.1.0/search/variables_0.js b/doc/v1.1.0/search/variables_0.js new file mode 100644 index 000000000..bbc532810 --- /dev/null +++ b/doc/v1.1.0/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_154',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.1.0/search/variables_1.html b/doc/v1.1.0/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/doc/v1.1.0/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.1.0/search/variables_1.js b/doc/v1.1.0/search/variables_1.js new file mode 100644 index 000000000..25a43a70b --- /dev/null +++ b/doc/v1.1.0/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_155',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.1.0/search/variables_2.html b/doc/v1.1.0/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/doc/v1.1.0/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.1.0/search/variables_2.js b/doc/v1.1.0/search/variables_2.js new file mode 100644 index 000000000..5313f9bd4 --- /dev/null +++ b/doc/v1.1.0/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_156',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_157',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.1.0/search/variables_3.html b/doc/v1.1.0/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/doc/v1.1.0/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.1.0/search/variables_3.js b/doc/v1.1.0/search/variables_3.js new file mode 100644 index 000000000..b8a64dacb --- /dev/null +++ b/doc/v1.1.0/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_158',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.1.0/server_accept.png b/doc/v1.1.0/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/doc/v1.1.0/server_accept.png differ diff --git a/doc/v1.1.0/splitbar.png b/doc/v1.1.0/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/doc/v1.1.0/splitbar.png differ diff --git a/doc/v1.1.0/structxcm__addr__host.html b/doc/v1.1.0/structxcm__addr__host.html new file mode 100644 index 000000000..3bc32f242 --- /dev/null +++ b/doc/v1.1.0/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..af689f74e --- /dev/null +++ b/doc/v1.1.0/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/doc/v1.1.0/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/doc/v1.1.0/xcm_8h.html b/doc/v1.1.0/xcm_8h.html new file mode 100644 index 000000000..801b65907 --- /dev/null +++ b/doc/v1.1.0/xcm_8h.html @@ -0,0 +1,905 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..69e432def --- /dev/null +++ b/doc/v1.1.0/xcm_8h_source.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1006 struct xcm_socket;
    +
    1007 
    +
    1058 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1059 
    +
    1081 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1082  const struct xcm_attr_map *attrs);
    +
    1083 
    +
    1114 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1115 
    +
    1131 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1132  const struct xcm_attr_map *attrs);
    +
    1133 
    +
    1150 int xcm_close(struct xcm_socket *socket);
    +
    1151 
    +
    1171 void xcm_cleanup(struct xcm_socket *socket);
    +
    1172 
    +
    1195 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1196 
    +
    1213 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1214  const struct xcm_attr_map *attrs);
    +
    1215 
    +
    1237 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1238 
    +
    1261 int 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 
    +
    1332 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1333 
    +
    1375 int xcm_fd(struct xcm_socket *socket);
    +
    1376 
    +
    1417 int xcm_finish(struct xcm_socket *socket);
    +
    1418 
    +
    1459 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1460 
    +
    1475 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1476 
    +
    1493 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1494 
    +
    1509 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..6bbedd2d2 --- /dev/null +++ b/doc/v1.1.0/xcm__addr_8h.html @@ -0,0 +1,940 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..257e59048 --- /dev/null +++ b/doc/v1.1.0/xcm__addr_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    39 enum 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];
    +
    58  } addr;
    +
    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 
    +
    88 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89 
    +
    103 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104  uint16_t *port);
    +
    105 
    +
    119 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120  uint16_t *port);
    +
    121 
    +
    136 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137  uint16_t *port);
    +
    138 
    +
    153 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154  uint16_t *port);
    +
    155 
    +
    169 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170 
    +
    184 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185  size_t capacity);
    +
    186 
    +
    202 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203  char *utls_addr_s, size_t capacity);
    +
    204 
    +
    220 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221  char *tls_addr_s, size_t capacity);
    +
    222 
    +
    238 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239  char *tcp_addr_s, size_t capacity);
    +
    240 
    +
    256 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257  char *sctp_addr_s, size_t capacity);
    +
    258 
    +
    273 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274 
    +
    289 int 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..b9d26ab32 --- /dev/null +++ b/doc/v1.1.0/xcm__attr_8h.html @@ -0,0 +1,614 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..dc9328e6e --- /dev/null +++ b/doc/v1.1.0/xcm__attr_8h_source.html @@ -0,0 +1,137 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *s, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *s, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *s, const char *name, int64_t value);
    +
    74 
    +
    87 int xcm_attr_set_str(struct xcm_socket *s, const char *name,
    +
    88  const char *value);
    +
    89 
    +
    115 int xcm_attr_get(struct xcm_socket *s, const char *name,
    +
    116  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    117 
    +
    134 int xcm_attr_get_bool(struct xcm_socket *s, const char *name,
    +
    135  bool *value);
    +
    136 
    +
    153 int xcm_attr_get_int64(struct xcm_socket *s, const char *name,
    +
    154  int64_t *value);
    +
    155 
    +
    174 int xcm_attr_get_str(struct xcm_socket *s, const char *name,
    +
    175  char *value, size_t capacity);
    +
    176 
    +
    178 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    179  void *value, size_t value_len, void *cb_data);
    +
    180 
    +
    194 void 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..f2b9eb621 --- /dev/null +++ b/doc/v1.1.0/xcm__attr__map_8h.html @@ -0,0 +1,766 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..ef4af6a89 --- /dev/null +++ b/doc/v1.1.0/xcm__attr__map_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name,
    +
    81  bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name,
    +
    95  int64_t attr_value);
    +
    96 
    +
    97 
    +
    107 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108  const char *attr_name,
    +
    109  const char *attr_value);
    +
    110 
    +
    111 
    +
    128 const 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 
    +
    148 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149  const char *attr_name);
    +
    150 
    +
    151 
    +
    166 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167  const char *attr_name);
    +
    168 
    +
    169 
    +
    184 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185  const char *attr_name);
    +
    186 
    +
    195 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196  const char *attr_name);
    +
    197 
    +
    198 
    +
    207 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208 
    +
    209 
    +
    217 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218 
    +
    219 
    +
    223 typedef 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 
    +
    242 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243  xcm_attr_map_foreach_cb cb, void *user);
    +
    244 
    +
    245 
    +
    254 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255  const struct xcm_attr_map *attr_map_b);
    +
    256 
    +
    265 void 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)
    +
    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_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 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 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..c4378f9e7 --- /dev/null +++ b/doc/v1.1.0/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..8c1b0a534 --- /dev/null +++ b/doc/v1.1.0/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..eae6b4d7e --- /dev/null +++ b/doc/v1.1.0/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..bf5a55c0f --- /dev/null +++ b/doc/v1.1.0/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    118 int 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..0a0a42a26 --- /dev/null +++ b/doc/v1.1.0/xcm__version_8h.html @@ -0,0 +1,266 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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.1.0/xcm__version_8h_source.html b/doc/v1.1.0/xcm__version_8h_source.html new file mode 100644 index 000000000..7a01da1e9 --- /dev/null +++ b/doc/v1.1.0/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    59 unsigned int xcm_version_major(void);
    +
    60 
    +
    67 unsigned int xcm_version_minor(void);
    +
    68 
    +
    74 unsigned int xcm_version_patch(void);
    +
    75 
    +
    84 const char *xcm_version(void);
    +
    85 
    +
    91 unsigned int xcm_version_api_major(void);
    +
    92 
    +
    98 unsigned int xcm_version_api_minor(void);
    +
    99 
    +
    108 const char *xcm_version_api(void);
    +
    109 
    +
    110 #ifdef __cplusplus
    +
    111 }
    +
    112 #endif
    +
    113 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..91391d9b9 --- /dev/null +++ b/doc/v1.2.0/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/doc/v1.2.0/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/doc/v1.2.0/bdwn.png differ diff --git a/doc/v1.2.0/classes.html b/doc/v1.2.0/classes.html new file mode 100644 index 000000000..8ab2cac10 --- /dev/null +++ b/doc/v1.2.0/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..ce4593ffd --- /dev/null +++ b/doc/v1.2.0/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,100 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/doc/v1.2.0/doc.png b/doc/v1.2.0/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/doc/v1.2.0/doc.png differ diff --git a/doc/v1.2.0/doxygen.css b/doc/v1.2.0/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/doc/v1.2.0/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doc/v1.2.0/doxygen.svg b/doc/v1.2.0/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/doc/v1.2.0/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.2.0/dynsections.js b/doc/v1.2.0/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/doc/v1.2.0/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/doc/v1.2.0/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/doc/v1.2.0/folderclosed.png differ diff --git a/doc/v1.2.0/folderopen.png b/doc/v1.2.0/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/doc/v1.2.0/folderopen.png differ diff --git a/doc/v1.2.0/functions.html b/doc/v1.2.0/functions.html new file mode 100644 index 000000000..9ca2bacca --- /dev/null +++ b/doc/v1.2.0/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..761552851 --- /dev/null +++ b/doc/v1.2.0/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.2.0/globals.html b/doc/v1.2.0/globals.html new file mode 100644 index 000000000..c64834235 --- /dev/null +++ b/doc/v1.2.0/globals.html @@ -0,0 +1,302 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..0dce4858d --- /dev/null +++ b/doc/v1.2.0/globals_defs.html @@ -0,0 +1,111 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.2.0/globals_enum.html b/doc/v1.2.0/globals_enum.html new file mode 100644 index 000000000..1d1e90458 --- /dev/null +++ b/doc/v1.2.0/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.2.0/globals_eval.html b/doc/v1.2.0/globals_eval.html new file mode 100644 index 000000000..2614d9ca9 --- /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) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.2.0/globals_func.html b/doc/v1.2.0/globals_func.html new file mode 100644 index 000000000..2988f209a --- /dev/null +++ b/doc/v1.2.0/globals_func.html @@ -0,0 +1,242 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - 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..b9d4773de --- /dev/null +++ b/doc/v1.2.0/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + 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..0f08b4af0 --- /dev/null +++ b/doc/v1.2.0/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.2.0/group__lib__version.html b/doc/v1.2.0/group__lib__version.html new file mode 100644 index 000000000..7f0858a9b --- /dev/null +++ b/doc/v1.2.0/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.2.0/index.html b/doc/v1.2.0/index.html new file mode 100644 index 000000000..7be8274d5 --- /dev/null +++ b/doc/v1.2.0/index.html @@ -0,0 +1,518 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/doc/v1.2.0/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/doc/v1.2.0/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/doc/v1.2.0/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/doc/v1.2.0/modules.html new file mode 100644 index 000000000..75399f90c --- /dev/null +++ b/doc/v1.2.0/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/doc/v1.2.0/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..32c9e08d3 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/doc/v1.2.0/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/doc/v1.2.0/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..7130f6379 --- /dev/null +++ b/doc/v1.2.0/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.2.0/search/all_1.html b/doc/v1.2.0/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/doc/v1.2.0/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..69f82ad46 --- /dev/null +++ b/doc/v1.2.0/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.2.0/search/all_2.html b/doc/v1.2.0/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/doc/v1.2.0/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ae6e4d753 --- /dev/null +++ b/doc/v1.2.0/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.2.0/search/all_3.html b/doc/v1.2.0/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/doc/v1.2.0/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..551054f77 --- /dev/null +++ b/doc/v1.2.0/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.2.0/search/all_4.html b/doc/v1.2.0/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/doc/v1.2.0/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..fd3d5a006 --- /dev/null +++ b/doc/v1.2.0/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.2.0/search/all_5.html b/doc/v1.2.0/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/doc/v1.2.0/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..16b2d8d7e --- /dev/null +++ b/doc/v1.2.0/search/all_5.js @@ -0,0 +1,87 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_8',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_9',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_10',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_11',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_12',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_13',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_14',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_15',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_16',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_17',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_18',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_19',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_20',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_21',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_22',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_23',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_24',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_25',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_26',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_27',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_28',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',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_5fint64_30',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_31',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_32',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_33',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_38',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_46',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_47',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_48',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_49',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_50',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_51',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',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_5fattr_5ftype_54',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_55',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_56',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_57',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_58',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_59',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_60',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_61',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_62',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_63',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_64',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_65',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_66',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_67',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_68',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_69',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_70',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_71',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_72',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_73',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_74',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_75',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_76',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_77',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_78',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_79',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_80',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_81',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_82',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_83',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_84',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_85',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_86',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_87',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_88',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_89',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.2.0/search/all_6.html b/doc/v1.2.0/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/doc/v1.2.0/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5debab10e --- /dev/null +++ b/doc/v1.2.0/search/all_6.js @@ -0,0 +1,119 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_14',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_15',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_16',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_17',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_18',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_19',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_20',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_21',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_22',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_23',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_24',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_25',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_26',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_27',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_28',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_29',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_30',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_31',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_32',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_33',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_34',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_35',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_36',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_37',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_38',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_39',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_40',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_41',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_51',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_59',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_60',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_61',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_62',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_63',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_84',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',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#a4d8d62a9625b49993b7d6ec03de8e765',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#ad52a0d86b7b5bf802835758cc9251e2e',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#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_98',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',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',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_109',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_110',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_111',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_112',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_113',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_114',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_115',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_116',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_117',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_118',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_119',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_120',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_121',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_122',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_123',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.2.0/search/classes_0.html b/doc/v1.2.0/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/doc/v1.2.0/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..468741d24 --- /dev/null +++ b/doc/v1.2.0/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_90',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_91',['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..a933eea1a --- /dev/null +++ b/doc/v1.2.0/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/doc/v1.2.0/search/defines_0.html b/doc/v1.2.0/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/doc/v1.2.0/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ed9b81242 --- /dev/null +++ b/doc/v1.2.0/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_166',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_167',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_168',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_169',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_170',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_171',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_172',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_173',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_174',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_175',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_176',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_177',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_178',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.2.0/search/enums_0.html b/doc/v1.2.0/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/doc/v1.2.0/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..623970eaa --- /dev/null +++ b/doc/v1.2.0/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_161',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.2.0/search/enumvalues_0.html b/doc/v1.2.0/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/doc/v1.2.0/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..bf116ee08 --- /dev/null +++ b/doc/v1.2.0/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_162',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_163',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_164',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_165',['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.html b/doc/v1.2.0/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/doc/v1.2.0/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..d46f54089 --- /dev/null +++ b/doc/v1.2.0/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_92',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_93',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_94',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_95',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_96',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_97',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/doc/v1.2.0/search/functions_0.html b/doc/v1.2.0/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/doc/v1.2.0/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..76fd95c5b --- /dev/null +++ b/doc/v1.2.0/search/functions_0.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['xcm_5faccept_98',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_99',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_100',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_101',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_102',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_103',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_104',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_105',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_106',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_107',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_108',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_109',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_110',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_111',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_112',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_113',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_114',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_115',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_116',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_117',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_118',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_119',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_120',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_121',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_122',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_123',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_124',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_125',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_126',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_127',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_128',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_129',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_130',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_131',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_132',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_133',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_134',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_135',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_136',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_137',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_138',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_139',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_140',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_141',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_142',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_143',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_144',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_145',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_146',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_147',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_148',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_149',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_150',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_151',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_152',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_153',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.2.0/search/groups_0.html b/doc/v1.2.0/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/doc/v1.2.0/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ee66bd8d9 --- /dev/null +++ b/doc/v1.2.0/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_238',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.2.0/search/groups_1.html b/doc/v1.2.0/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/doc/v1.2.0/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..73d61cda3 --- /dev/null +++ b/doc/v1.2.0/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_239',['Library Version',['../group__lib__version.html',1,'']]] +]; 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..03626f64a --- /dev/null +++ b/doc/v1.2.0/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/doc/v1.2.0/search/nomatches.html b/doc/v1.2.0/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/doc/v1.2.0/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/doc/v1.2.0/search/pages_0.html b/doc/v1.2.0/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/doc/v1.2.0/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..c122886e8 --- /dev/null +++ b/doc/v1.2.0/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_179',['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..9074198f8 --- /dev/null +++ b/doc/v1.2.0/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/doc/v1.2.0/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.2.0/search/typedefs_0.js b/doc/v1.2.0/search/typedefs_0.js new file mode 100644 index 000000000..c9347964e --- /dev/null +++ b/doc/v1.2.0/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_159',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_160',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/doc/v1.2.0/search/variables_0.html b/doc/v1.2.0/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/doc/v1.2.0/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.2.0/search/variables_0.js b/doc/v1.2.0/search/variables_0.js new file mode 100644 index 000000000..bbc532810 --- /dev/null +++ b/doc/v1.2.0/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_154',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.2.0/search/variables_1.html b/doc/v1.2.0/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/doc/v1.2.0/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.2.0/search/variables_1.js b/doc/v1.2.0/search/variables_1.js new file mode 100644 index 000000000..25a43a70b --- /dev/null +++ b/doc/v1.2.0/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_155',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.2.0/search/variables_2.html b/doc/v1.2.0/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/doc/v1.2.0/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.2.0/search/variables_2.js b/doc/v1.2.0/search/variables_2.js new file mode 100644 index 000000000..5313f9bd4 --- /dev/null +++ b/doc/v1.2.0/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_156',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_157',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.2.0/search/variables_3.html b/doc/v1.2.0/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/doc/v1.2.0/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.2.0/search/variables_3.js b/doc/v1.2.0/search/variables_3.js new file mode 100644 index 000000000..b8a64dacb --- /dev/null +++ b/doc/v1.2.0/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_158',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.2.0/server_accept.png b/doc/v1.2.0/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/doc/v1.2.0/server_accept.png differ diff --git a/doc/v1.2.0/splitbar.png b/doc/v1.2.0/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/doc/v1.2.0/splitbar.png differ diff --git a/doc/v1.2.0/structxcm__addr__host.html b/doc/v1.2.0/structxcm__addr__host.html new file mode 100644 index 000000000..0f3edf3c5 --- /dev/null +++ b/doc/v1.2.0/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..6eb834575 --- /dev/null +++ b/doc/v1.2.0/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/doc/v1.2.0/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/doc/v1.2.0/xcm_8h.html b/doc/v1.2.0/xcm_8h.html new file mode 100644 index 000000000..526f29d5d --- /dev/null +++ b/doc/v1.2.0/xcm_8h.html @@ -0,0 +1,905 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..79c358455 --- /dev/null +++ b/doc/v1.2.0/xcm_8h_source.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1023 struct xcm_socket;
    +
    1024 
    +
    1075 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1076 
    +
    1098 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1099  const struct xcm_attr_map *attrs);
    +
    1100 
    +
    1131 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1132 
    +
    1148 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1149  const struct xcm_attr_map *attrs);
    +
    1150 
    +
    1167 int xcm_close(struct xcm_socket *socket);
    +
    1168 
    +
    1188 void xcm_cleanup(struct xcm_socket *socket);
    +
    1189 
    +
    1212 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1213 
    +
    1230 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1231  const struct xcm_attr_map *attrs);
    +
    1232 
    +
    1254 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1255 
    +
    1278 int 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 
    +
    1349 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1350 
    +
    1392 int xcm_fd(struct xcm_socket *socket);
    +
    1393 
    +
    1434 int xcm_finish(struct xcm_socket *socket);
    +
    1435 
    +
    1476 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1477 
    +
    1492 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1493 
    +
    1510 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1511 
    +
    1526 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..7732f2af4 --- /dev/null +++ b/doc/v1.2.0/xcm__addr_8h.html @@ -0,0 +1,940 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..8aacc1942 --- /dev/null +++ b/doc/v1.2.0/xcm__addr_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    39 enum 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];
    +
    58  } addr;
    +
    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 
    +
    88 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89 
    +
    103 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104  uint16_t *port);
    +
    105 
    +
    119 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120  uint16_t *port);
    +
    121 
    +
    136 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137  uint16_t *port);
    +
    138 
    +
    153 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154  uint16_t *port);
    +
    155 
    +
    169 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170 
    +
    184 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185  size_t capacity);
    +
    186 
    +
    202 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203  char *utls_addr_s, size_t capacity);
    +
    204 
    +
    220 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221  char *tls_addr_s, size_t capacity);
    +
    222 
    +
    238 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239  char *tcp_addr_s, size_t capacity);
    +
    240 
    +
    256 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257  char *sctp_addr_s, size_t capacity);
    +
    258 
    +
    273 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274 
    +
    289 int 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..b376a3d95 --- /dev/null +++ b/doc/v1.2.0/xcm__attr_8h.html @@ -0,0 +1,614 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..d557ee973 --- /dev/null +++ b/doc/v1.2.0/xcm__attr_8h_source.html @@ -0,0 +1,139 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89  const char *value);
    +
    90 
    +
    116 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118 
    +
    135 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136  bool *value);
    +
    137 
    +
    154 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155  int64_t *value);
    +
    156 
    +
    175 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176  char *value, size_t capacity);
    +
    177 
    +
    179 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180  void *value, size_t value_len, void *cb_data);
    +
    181 
    +
    195 void 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..a836c1a9e --- /dev/null +++ b/doc/v1.2.0/xcm__attr__map_8h.html @@ -0,0 +1,766 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..b7a2291f4 --- /dev/null +++ b/doc/v1.2.0/xcm__attr__map_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name,
    +
    81  bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name,
    +
    95  int64_t attr_value);
    +
    96 
    +
    97 
    +
    107 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108  const char *attr_name,
    +
    109  const char *attr_value);
    +
    110 
    +
    111 
    +
    128 const 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 
    +
    148 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149  const char *attr_name);
    +
    150 
    +
    151 
    +
    166 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167  const char *attr_name);
    +
    168 
    +
    169 
    +
    184 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185  const char *attr_name);
    +
    186 
    +
    195 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196  const char *attr_name);
    +
    197 
    +
    198 
    +
    207 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208 
    +
    209 
    +
    217 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218 
    +
    219 
    +
    223 typedef 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 
    +
    242 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243  xcm_attr_map_foreach_cb cb, void *user);
    +
    244 
    +
    245 
    +
    254 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255  const struct xcm_attr_map *attr_map_b);
    +
    256 
    +
    265 void 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)
    +
    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_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 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 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..9c9346d1c --- /dev/null +++ b/doc/v1.2.0/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..9668d41db --- /dev/null +++ b/doc/v1.2.0/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..a730f6209 --- /dev/null +++ b/doc/v1.2.0/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..34aa2672e --- /dev/null +++ b/doc/v1.2.0/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..0a0a42a26 --- /dev/null +++ b/doc/v1.2.0/xcm__version_8h.html @@ -0,0 +1,266 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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.2.0/xcm__version_8h_source.html b/doc/v1.2.0/xcm__version_8h_source.html new file mode 100644 index 000000000..7a01da1e9 --- /dev/null +++ b/doc/v1.2.0/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    59 unsigned int xcm_version_major(void);
    +
    60 
    +
    67 unsigned int xcm_version_minor(void);
    +
    68 
    +
    74 unsigned int xcm_version_patch(void);
    +
    75 
    +
    84 const char *xcm_version(void);
    +
    85 
    +
    91 unsigned int xcm_version_api_major(void);
    +
    92 
    +
    98 unsigned int xcm_version_api_minor(void);
    +
    99 
    +
    108 const char *xcm_version_api(void);
    +
    109 
    +
    110 #ifdef __cplusplus
    +
    111 }
    +
    112 #endif
    +
    113 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..5fde0daa0 --- /dev/null +++ b/doc/v1.3.0/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/doc/v1.3.0/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/doc/v1.3.0/bdwn.png differ diff --git a/doc/v1.3.0/classes.html b/doc/v1.3.0/classes.html new file mode 100644 index 000000000..b275bec77 --- /dev/null +++ b/doc/v1.3.0/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..447c4e317 --- /dev/null +++ b/doc/v1.3.0/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,100 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/doc/v1.3.0/doc.png b/doc/v1.3.0/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/doc/v1.3.0/doc.png differ diff --git a/doc/v1.3.0/doxygen.css b/doc/v1.3.0/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/doc/v1.3.0/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doc/v1.3.0/doxygen.svg b/doc/v1.3.0/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/doc/v1.3.0/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.3.0/dynsections.js b/doc/v1.3.0/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/doc/v1.3.0/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/doc/v1.3.0/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/doc/v1.3.0/folderclosed.png differ diff --git a/doc/v1.3.0/folderopen.png b/doc/v1.3.0/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/doc/v1.3.0/folderopen.png differ diff --git a/doc/v1.3.0/functions.html b/doc/v1.3.0/functions.html new file mode 100644 index 000000000..cc2597c49 --- /dev/null +++ b/doc/v1.3.0/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..223e26bf6 --- /dev/null +++ b/doc/v1.3.0/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.3.0/globals.html b/doc/v1.3.0/globals.html new file mode 100644 index 000000000..78c6574b4 --- /dev/null +++ b/doc/v1.3.0/globals.html @@ -0,0 +1,302 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..6bf195d09 --- /dev/null +++ b/doc/v1.3.0/globals_defs.html @@ -0,0 +1,111 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.3.0/globals_enum.html b/doc/v1.3.0/globals_enum.html new file mode 100644 index 000000000..f1af0f74a --- /dev/null +++ b/doc/v1.3.0/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.3.0/globals_eval.html b/doc/v1.3.0/globals_eval.html new file mode 100644 index 000000000..06126ca13 --- /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) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.3.0/globals_func.html b/doc/v1.3.0/globals_func.html new file mode 100644 index 000000000..37d5b8c9f --- /dev/null +++ b/doc/v1.3.0/globals_func.html @@ -0,0 +1,242 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - 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..a61732d60 --- /dev/null +++ b/doc/v1.3.0/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + 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..0f08b4af0 --- /dev/null +++ b/doc/v1.3.0/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.3.0/group__lib__version.html b/doc/v1.3.0/group__lib__version.html new file mode 100644 index 000000000..7f0858a9b --- /dev/null +++ b/doc/v1.3.0/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.3.0/index.html b/doc/v1.3.0/index.html new file mode 100644 index 000000000..eb2024413 --- /dev/null +++ b/doc/v1.3.0/index.html @@ -0,0 +1,553 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/doc/v1.3.0/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/doc/v1.3.0/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/doc/v1.3.0/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/doc/v1.3.0/modules.html new file mode 100644 index 000000000..75399f90c --- /dev/null +++ b/doc/v1.3.0/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/doc/v1.3.0/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..32c9e08d3 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/doc/v1.3.0/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/doc/v1.3.0/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..7130f6379 --- /dev/null +++ b/doc/v1.3.0/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.3.0/search/all_1.html b/doc/v1.3.0/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/doc/v1.3.0/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..69f82ad46 --- /dev/null +++ b/doc/v1.3.0/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.3.0/search/all_2.html b/doc/v1.3.0/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/doc/v1.3.0/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ae6e4d753 --- /dev/null +++ b/doc/v1.3.0/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.3.0/search/all_3.html b/doc/v1.3.0/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/doc/v1.3.0/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..551054f77 --- /dev/null +++ b/doc/v1.3.0/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.3.0/search/all_4.html b/doc/v1.3.0/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/doc/v1.3.0/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..fd3d5a006 --- /dev/null +++ b/doc/v1.3.0/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.3.0/search/all_5.html b/doc/v1.3.0/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/doc/v1.3.0/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..16b2d8d7e --- /dev/null +++ b/doc/v1.3.0/search/all_5.js @@ -0,0 +1,87 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_8',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_9',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_10',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_11',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_12',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_13',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_14',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_15',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_16',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_17',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_18',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_19',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_20',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_21',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_22',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_23',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_24',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_25',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_26',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_27',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_28',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',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_5fint64_30',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_31',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_32',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_33',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_38',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_46',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_47',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_48',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_49',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_50',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_51',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',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_5fattr_5ftype_54',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_55',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_56',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_57',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_58',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_59',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_60',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_61',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_62',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_63',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_64',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_65',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_66',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_67',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_68',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_69',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_70',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_71',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_72',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_73',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_74',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_75',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_76',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_77',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_78',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_79',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_80',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_81',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_82',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_83',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_84',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_85',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_86',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_87',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_88',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_89',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.3.0/search/all_6.html b/doc/v1.3.0/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/doc/v1.3.0/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5debab10e --- /dev/null +++ b/doc/v1.3.0/search/all_6.js @@ -0,0 +1,119 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_14',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_15',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_16',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_17',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_18',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_19',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_20',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_21',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_22',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_23',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_24',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_25',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_26',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_27',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_28',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_29',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_30',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_31',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_32',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_33',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_34',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_35',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_36',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_37',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_38',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_39',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_40',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_41',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_51',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_59',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_60',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_61',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_62',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_63',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_84',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',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#a4d8d62a9625b49993b7d6ec03de8e765',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#ad52a0d86b7b5bf802835758cc9251e2e',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#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_98',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',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',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_109',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_110',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_111',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_112',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_113',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_114',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_115',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_116',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_117',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_118',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_119',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_120',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_121',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_122',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_123',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.3.0/search/classes_0.html b/doc/v1.3.0/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/doc/v1.3.0/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..468741d24 --- /dev/null +++ b/doc/v1.3.0/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_90',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_91',['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..a933eea1a --- /dev/null +++ b/doc/v1.3.0/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/doc/v1.3.0/search/defines_0.html b/doc/v1.3.0/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/doc/v1.3.0/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ed9b81242 --- /dev/null +++ b/doc/v1.3.0/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_166',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_167',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_168',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_169',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_170',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_171',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_172',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_173',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_174',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_175',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_176',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_177',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_178',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.3.0/search/enums_0.html b/doc/v1.3.0/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/doc/v1.3.0/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..623970eaa --- /dev/null +++ b/doc/v1.3.0/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_161',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.3.0/search/enumvalues_0.html b/doc/v1.3.0/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/doc/v1.3.0/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..bf116ee08 --- /dev/null +++ b/doc/v1.3.0/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_162',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_163',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_164',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_165',['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.html b/doc/v1.3.0/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/doc/v1.3.0/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..d46f54089 --- /dev/null +++ b/doc/v1.3.0/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_92',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_93',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_94',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_95',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_96',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_97',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/doc/v1.3.0/search/functions_0.html b/doc/v1.3.0/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/doc/v1.3.0/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..76fd95c5b --- /dev/null +++ b/doc/v1.3.0/search/functions_0.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['xcm_5faccept_98',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_99',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_100',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_101',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_102',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_103',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_104',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_105',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_106',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_107',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_108',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_109',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_110',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_111',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_112',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_113',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_114',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_115',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_116',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_117',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_118',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_119',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_120',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_121',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_122',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_123',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_124',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_125',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_126',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_127',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_128',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_129',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_130',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_131',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_132',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_133',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_134',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_135',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_136',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_137',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_138',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_139',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_140',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_141',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_142',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_143',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_144',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_145',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_146',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_147',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_148',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_149',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_150',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_151',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_152',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_153',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.3.0/search/groups_0.html b/doc/v1.3.0/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/doc/v1.3.0/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ee66bd8d9 --- /dev/null +++ b/doc/v1.3.0/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_238',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.3.0/search/groups_1.html b/doc/v1.3.0/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/doc/v1.3.0/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..73d61cda3 --- /dev/null +++ b/doc/v1.3.0/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_239',['Library Version',['../group__lib__version.html',1,'']]] +]; 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..03626f64a --- /dev/null +++ b/doc/v1.3.0/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/doc/v1.3.0/search/nomatches.html b/doc/v1.3.0/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/doc/v1.3.0/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/doc/v1.3.0/search/pages_0.html b/doc/v1.3.0/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/doc/v1.3.0/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..c122886e8 --- /dev/null +++ b/doc/v1.3.0/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_179',['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..9074198f8 --- /dev/null +++ b/doc/v1.3.0/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/doc/v1.3.0/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.3.0/search/typedefs_0.js b/doc/v1.3.0/search/typedefs_0.js new file mode 100644 index 000000000..c9347964e --- /dev/null +++ b/doc/v1.3.0/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_159',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_160',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/doc/v1.3.0/search/variables_0.html b/doc/v1.3.0/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/doc/v1.3.0/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.3.0/search/variables_0.js b/doc/v1.3.0/search/variables_0.js new file mode 100644 index 000000000..bbc532810 --- /dev/null +++ b/doc/v1.3.0/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_154',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.3.0/search/variables_1.html b/doc/v1.3.0/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/doc/v1.3.0/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.3.0/search/variables_1.js b/doc/v1.3.0/search/variables_1.js new file mode 100644 index 000000000..25a43a70b --- /dev/null +++ b/doc/v1.3.0/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_155',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.3.0/search/variables_2.html b/doc/v1.3.0/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/doc/v1.3.0/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.3.0/search/variables_2.js b/doc/v1.3.0/search/variables_2.js new file mode 100644 index 000000000..5313f9bd4 --- /dev/null +++ b/doc/v1.3.0/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_156',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_157',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.3.0/search/variables_3.html b/doc/v1.3.0/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/doc/v1.3.0/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.3.0/search/variables_3.js b/doc/v1.3.0/search/variables_3.js new file mode 100644 index 000000000..b8a64dacb --- /dev/null +++ b/doc/v1.3.0/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_158',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.3.0/server_accept.png b/doc/v1.3.0/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/doc/v1.3.0/server_accept.png differ diff --git a/doc/v1.3.0/splitbar.png b/doc/v1.3.0/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/doc/v1.3.0/splitbar.png differ diff --git a/doc/v1.3.0/structxcm__addr__host.html b/doc/v1.3.0/structxcm__addr__host.html new file mode 100644 index 000000000..0ca933c54 --- /dev/null +++ b/doc/v1.3.0/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..cb70d31e1 --- /dev/null +++ b/doc/v1.3.0/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/doc/v1.3.0/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/doc/v1.3.0/xcm_8h.html b/doc/v1.3.0/xcm_8h.html new file mode 100644 index 000000000..dacf0f2f8 --- /dev/null +++ b/doc/v1.3.0/xcm_8h.html @@ -0,0 +1,905 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..dd43c3a15 --- /dev/null +++ b/doc/v1.3.0/xcm_8h_source.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1114 struct xcm_socket;
    +
    1115 
    +
    1166 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1167 
    +
    1189 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1190  const struct xcm_attr_map *attrs);
    +
    1191 
    +
    1222 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1223 
    +
    1239 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1240  const struct xcm_attr_map *attrs);
    +
    1241 
    +
    1258 int xcm_close(struct xcm_socket *socket);
    +
    1259 
    +
    1279 void xcm_cleanup(struct xcm_socket *socket);
    +
    1280 
    +
    1303 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1304 
    +
    1321 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1322  const struct xcm_attr_map *attrs);
    +
    1323 
    +
    1345 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1346 
    +
    1369 int 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 
    +
    1440 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1441 
    +
    1483 int xcm_fd(struct xcm_socket *socket);
    +
    1484 
    +
    1525 int xcm_finish(struct xcm_socket *socket);
    +
    1526 
    +
    1567 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1568 
    +
    1583 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1584 
    +
    1601 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1602 
    +
    1617 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..91c192ab5 --- /dev/null +++ b/doc/v1.3.0/xcm__addr_8h.html @@ -0,0 +1,940 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..c27a567be --- /dev/null +++ b/doc/v1.3.0/xcm__addr_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    39 enum 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];
    +
    58  } addr;
    +
    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 
    +
    88 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89 
    +
    103 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104  uint16_t *port);
    +
    105 
    +
    119 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120  uint16_t *port);
    +
    121 
    +
    136 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137  uint16_t *port);
    +
    138 
    +
    153 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154  uint16_t *port);
    +
    155 
    +
    169 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170 
    +
    184 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185  size_t capacity);
    +
    186 
    +
    202 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203  char *utls_addr_s, size_t capacity);
    +
    204 
    +
    220 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221  char *tls_addr_s, size_t capacity);
    +
    222 
    +
    238 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239  char *tcp_addr_s, size_t capacity);
    +
    240 
    +
    256 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257  char *sctp_addr_s, size_t capacity);
    +
    258 
    +
    273 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274 
    +
    289 int 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..2a5b7f78c --- /dev/null +++ b/doc/v1.3.0/xcm__attr_8h.html @@ -0,0 +1,614 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..57276c1cd --- /dev/null +++ b/doc/v1.3.0/xcm__attr_8h_source.html @@ -0,0 +1,139 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89  const char *value);
    +
    90 
    +
    116 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118 
    +
    135 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136  bool *value);
    +
    137 
    +
    154 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155  int64_t *value);
    +
    156 
    +
    175 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176  char *value, size_t capacity);
    +
    177 
    +
    179 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180  void *value, size_t value_len, void *cb_data);
    +
    181 
    +
    195 void 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..46f4453e1 --- /dev/null +++ b/doc/v1.3.0/xcm__attr__map_8h.html @@ -0,0 +1,766 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..459076ced --- /dev/null +++ b/doc/v1.3.0/xcm__attr__map_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name,
    +
    81  bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name,
    +
    95  int64_t attr_value);
    +
    96 
    +
    97 
    +
    107 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108  const char *attr_name,
    +
    109  const char *attr_value);
    +
    110 
    +
    111 
    +
    128 const 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 
    +
    148 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149  const char *attr_name);
    +
    150 
    +
    151 
    +
    166 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167  const char *attr_name);
    +
    168 
    +
    169 
    +
    184 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185  const char *attr_name);
    +
    186 
    +
    195 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196  const char *attr_name);
    +
    197 
    +
    198 
    +
    207 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208 
    +
    209 
    +
    217 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218 
    +
    219 
    +
    223 typedef 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 
    +
    242 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243  xcm_attr_map_foreach_cb cb, void *user);
    +
    244 
    +
    245 
    +
    254 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255  const struct xcm_attr_map *attr_map_b);
    +
    256 
    +
    265 void 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)
    +
    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_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 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 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..0f75536ef --- /dev/null +++ b/doc/v1.3.0/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..f3fc194dd --- /dev/null +++ b/doc/v1.3.0/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..85a6fa379 --- /dev/null +++ b/doc/v1.3.0/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..093d18797 --- /dev/null +++ b/doc/v1.3.0/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..0a0a42a26 --- /dev/null +++ b/doc/v1.3.0/xcm__version_8h.html @@ -0,0 +1,266 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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.3.0/xcm__version_8h_source.html b/doc/v1.3.0/xcm__version_8h_source.html new file mode 100644 index 000000000..7a01da1e9 --- /dev/null +++ b/doc/v1.3.0/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    59 unsigned int xcm_version_major(void);
    +
    60 
    +
    67 unsigned int xcm_version_minor(void);
    +
    68 
    +
    74 unsigned int xcm_version_patch(void);
    +
    75 
    +
    84 const char *xcm_version(void);
    +
    85 
    +
    91 unsigned int xcm_version_api_major(void);
    +
    92 
    +
    98 unsigned int xcm_version_api_minor(void);
    +
    99 
    +
    108 const char *xcm_version_api(void);
    +
    109 
    +
    110 #ifdef __cplusplus
    +
    111 }
    +
    112 #endif
    +
    113 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..b52c6a033 --- /dev/null +++ b/doc/v1.3.1/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/doc/v1.3.1/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/doc/v1.3.1/bdwn.png differ diff --git a/doc/v1.3.1/classes.html b/doc/v1.3.1/classes.html new file mode 100644 index 000000000..71a37412b --- /dev/null +++ b/doc/v1.3.1/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..6facc2125 --- /dev/null +++ b/doc/v1.3.1/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,100 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/doc/v1.3.1/doc.png b/doc/v1.3.1/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/doc/v1.3.1/doc.png differ diff --git a/doc/v1.3.1/doxygen.css b/doc/v1.3.1/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/doc/v1.3.1/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doc/v1.3.1/doxygen.svg b/doc/v1.3.1/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/doc/v1.3.1/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.3.1/dynsections.js b/doc/v1.3.1/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/doc/v1.3.1/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/doc/v1.3.1/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/doc/v1.3.1/folderclosed.png differ diff --git a/doc/v1.3.1/folderopen.png b/doc/v1.3.1/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/doc/v1.3.1/folderopen.png differ diff --git a/doc/v1.3.1/functions.html b/doc/v1.3.1/functions.html new file mode 100644 index 000000000..4dd66733e --- /dev/null +++ b/doc/v1.3.1/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..9429bac4a --- /dev/null +++ b/doc/v1.3.1/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.3.1/globals.html b/doc/v1.3.1/globals.html new file mode 100644 index 000000000..b8ae27fa2 --- /dev/null +++ b/doc/v1.3.1/globals.html @@ -0,0 +1,302 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..bb8616a23 --- /dev/null +++ b/doc/v1.3.1/globals_defs.html @@ -0,0 +1,111 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.3.1/globals_enum.html b/doc/v1.3.1/globals_enum.html new file mode 100644 index 000000000..ee2f4c196 --- /dev/null +++ b/doc/v1.3.1/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.3.1/globals_eval.html b/doc/v1.3.1/globals_eval.html new file mode 100644 index 000000000..3597e7b82 --- /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) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.3.1/globals_func.html b/doc/v1.3.1/globals_func.html new file mode 100644 index 000000000..b71cdce27 --- /dev/null +++ b/doc/v1.3.1/globals_func.html @@ -0,0 +1,242 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - 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..8ffa306d9 --- /dev/null +++ b/doc/v1.3.1/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + 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..0f08b4af0 --- /dev/null +++ b/doc/v1.3.1/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.3.1/group__lib__version.html b/doc/v1.3.1/group__lib__version.html new file mode 100644 index 000000000..7f0858a9b --- /dev/null +++ b/doc/v1.3.1/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.3.1/index.html b/doc/v1.3.1/index.html new file mode 100644 index 000000000..43b965743 --- /dev/null +++ b/doc/v1.3.1/index.html @@ -0,0 +1,553 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/doc/v1.3.1/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/doc/v1.3.1/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/doc/v1.3.1/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/doc/v1.3.1/modules.html new file mode 100644 index 000000000..75399f90c --- /dev/null +++ b/doc/v1.3.1/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/doc/v1.3.1/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..32c9e08d3 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/doc/v1.3.1/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/doc/v1.3.1/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..7130f6379 --- /dev/null +++ b/doc/v1.3.1/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.3.1/search/all_1.html b/doc/v1.3.1/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/doc/v1.3.1/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..69f82ad46 --- /dev/null +++ b/doc/v1.3.1/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.3.1/search/all_2.html b/doc/v1.3.1/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/doc/v1.3.1/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ae6e4d753 --- /dev/null +++ b/doc/v1.3.1/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.3.1/search/all_3.html b/doc/v1.3.1/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/doc/v1.3.1/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..551054f77 --- /dev/null +++ b/doc/v1.3.1/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.3.1/search/all_4.html b/doc/v1.3.1/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/doc/v1.3.1/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..fd3d5a006 --- /dev/null +++ b/doc/v1.3.1/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.3.1/search/all_5.html b/doc/v1.3.1/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/doc/v1.3.1/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..16b2d8d7e --- /dev/null +++ b/doc/v1.3.1/search/all_5.js @@ -0,0 +1,87 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_8',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_9',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_10',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_11',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_12',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_13',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_14',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_15',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_16',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_17',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_18',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_19',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_20',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_21',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_22',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_23',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_24',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_25',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_26',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_27',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_28',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',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_5fint64_30',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_31',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_32',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_33',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_38',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_46',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_47',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_48',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_49',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_50',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_51',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',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_5fattr_5ftype_54',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_55',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_56',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_57',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_58',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_59',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_60',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_61',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_62',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_63',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_64',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_65',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_66',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_67',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_68',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_69',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_70',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_71',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_72',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_73',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_74',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_75',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_76',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_77',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_78',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_79',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_80',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_81',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_82',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_83',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_84',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_85',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_86',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_87',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_88',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_89',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.3.1/search/all_6.html b/doc/v1.3.1/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/doc/v1.3.1/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5debab10e --- /dev/null +++ b/doc/v1.3.1/search/all_6.js @@ -0,0 +1,119 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_14',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_15',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_16',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_17',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_18',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_19',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_20',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_21',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_22',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_23',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_24',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_25',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_26',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_27',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_28',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_29',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_30',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_31',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_32',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_33',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_34',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_35',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_36',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_37',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_38',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_39',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_40',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_41',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_51',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_59',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_60',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_61',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_62',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_63',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_84',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',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#a4d8d62a9625b49993b7d6ec03de8e765',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#ad52a0d86b7b5bf802835758cc9251e2e',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#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_98',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',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',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_109',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_110',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_111',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_112',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_113',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_114',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_115',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_116',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_117',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_118',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_119',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_120',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_121',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_122',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_123',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.3.1/search/classes_0.html b/doc/v1.3.1/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/doc/v1.3.1/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..468741d24 --- /dev/null +++ b/doc/v1.3.1/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_90',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_91',['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..a933eea1a --- /dev/null +++ b/doc/v1.3.1/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/doc/v1.3.1/search/defines_0.html b/doc/v1.3.1/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/doc/v1.3.1/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ed9b81242 --- /dev/null +++ b/doc/v1.3.1/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_166',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_167',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_168',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_169',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_170',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_171',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_172',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_173',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_174',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_175',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_176',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_177',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_178',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.3.1/search/enums_0.html b/doc/v1.3.1/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/doc/v1.3.1/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..623970eaa --- /dev/null +++ b/doc/v1.3.1/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_161',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.3.1/search/enumvalues_0.html b/doc/v1.3.1/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/doc/v1.3.1/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..bf116ee08 --- /dev/null +++ b/doc/v1.3.1/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_162',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_163',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_164',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_165',['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.html b/doc/v1.3.1/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/doc/v1.3.1/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..d46f54089 --- /dev/null +++ b/doc/v1.3.1/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_92',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_93',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_94',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_95',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_96',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_97',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/doc/v1.3.1/search/functions_0.html b/doc/v1.3.1/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/doc/v1.3.1/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..76fd95c5b --- /dev/null +++ b/doc/v1.3.1/search/functions_0.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['xcm_5faccept_98',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_99',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_100',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_101',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_102',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_103',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_104',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_105',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_106',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_107',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_108',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_109',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_110',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_111',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_112',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_113',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_114',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_115',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_116',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_117',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_118',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_119',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_120',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_121',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_122',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_123',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_124',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_125',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_126',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_127',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_128',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_129',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_130',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_131',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_132',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_133',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_134',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_135',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_136',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_137',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_138',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_139',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_140',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_141',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_142',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_143',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_144',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_145',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_146',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_147',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_148',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_149',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_150',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_151',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_152',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_153',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.3.1/search/groups_0.html b/doc/v1.3.1/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/doc/v1.3.1/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ee66bd8d9 --- /dev/null +++ b/doc/v1.3.1/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_238',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.3.1/search/groups_1.html b/doc/v1.3.1/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/doc/v1.3.1/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..73d61cda3 --- /dev/null +++ b/doc/v1.3.1/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_239',['Library Version',['../group__lib__version.html',1,'']]] +]; 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..03626f64a --- /dev/null +++ b/doc/v1.3.1/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/doc/v1.3.1/search/nomatches.html b/doc/v1.3.1/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/doc/v1.3.1/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/doc/v1.3.1/search/pages_0.html b/doc/v1.3.1/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/doc/v1.3.1/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..c122886e8 --- /dev/null +++ b/doc/v1.3.1/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_179',['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..9074198f8 --- /dev/null +++ b/doc/v1.3.1/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/doc/v1.3.1/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.3.1/search/typedefs_0.js b/doc/v1.3.1/search/typedefs_0.js new file mode 100644 index 000000000..c9347964e --- /dev/null +++ b/doc/v1.3.1/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_159',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_160',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/doc/v1.3.1/search/variables_0.html b/doc/v1.3.1/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/doc/v1.3.1/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.3.1/search/variables_0.js b/doc/v1.3.1/search/variables_0.js new file mode 100644 index 000000000..bbc532810 --- /dev/null +++ b/doc/v1.3.1/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_154',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.3.1/search/variables_1.html b/doc/v1.3.1/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/doc/v1.3.1/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.3.1/search/variables_1.js b/doc/v1.3.1/search/variables_1.js new file mode 100644 index 000000000..25a43a70b --- /dev/null +++ b/doc/v1.3.1/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_155',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.3.1/search/variables_2.html b/doc/v1.3.1/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/doc/v1.3.1/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.3.1/search/variables_2.js b/doc/v1.3.1/search/variables_2.js new file mode 100644 index 000000000..5313f9bd4 --- /dev/null +++ b/doc/v1.3.1/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_156',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_157',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.3.1/search/variables_3.html b/doc/v1.3.1/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/doc/v1.3.1/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.3.1/search/variables_3.js b/doc/v1.3.1/search/variables_3.js new file mode 100644 index 000000000..b8a64dacb --- /dev/null +++ b/doc/v1.3.1/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_158',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.3.1/server_accept.png b/doc/v1.3.1/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/doc/v1.3.1/server_accept.png differ diff --git a/doc/v1.3.1/splitbar.png b/doc/v1.3.1/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/doc/v1.3.1/splitbar.png differ diff --git a/doc/v1.3.1/structxcm__addr__host.html b/doc/v1.3.1/structxcm__addr__host.html new file mode 100644 index 000000000..29e7bab48 --- /dev/null +++ b/doc/v1.3.1/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..09f084d86 --- /dev/null +++ b/doc/v1.3.1/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/doc/v1.3.1/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/doc/v1.3.1/xcm_8h.html b/doc/v1.3.1/xcm_8h.html new file mode 100644 index 000000000..aed5cc7d3 --- /dev/null +++ b/doc/v1.3.1/xcm_8h.html @@ -0,0 +1,905 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..e5e9f54c8 --- /dev/null +++ b/doc/v1.3.1/xcm_8h_source.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1114 struct xcm_socket;
    +
    1115 
    +
    1166 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1167 
    +
    1189 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1190  const struct xcm_attr_map *attrs);
    +
    1191 
    +
    1222 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1223 
    +
    1239 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1240  const struct xcm_attr_map *attrs);
    +
    1241 
    +
    1258 int xcm_close(struct xcm_socket *socket);
    +
    1259 
    +
    1279 void xcm_cleanup(struct xcm_socket *socket);
    +
    1280 
    +
    1303 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1304 
    +
    1321 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1322  const struct xcm_attr_map *attrs);
    +
    1323 
    +
    1345 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1346 
    +
    1369 int 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 
    +
    1440 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1441 
    +
    1483 int xcm_fd(struct xcm_socket *socket);
    +
    1484 
    +
    1525 int xcm_finish(struct xcm_socket *socket);
    +
    1526 
    +
    1567 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1568 
    +
    1583 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1584 
    +
    1601 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1602 
    +
    1617 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..88ca31a47 --- /dev/null +++ b/doc/v1.3.1/xcm__addr_8h.html @@ -0,0 +1,940 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..f8bd4bcad --- /dev/null +++ b/doc/v1.3.1/xcm__addr_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    39 enum 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];
    +
    58  } addr;
    +
    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 
    +
    88 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89 
    +
    103 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104  uint16_t *port);
    +
    105 
    +
    119 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120  uint16_t *port);
    +
    121 
    +
    136 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137  uint16_t *port);
    +
    138 
    +
    153 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154  uint16_t *port);
    +
    155 
    +
    169 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170 
    +
    184 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185  size_t capacity);
    +
    186 
    +
    202 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203  char *utls_addr_s, size_t capacity);
    +
    204 
    +
    220 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221  char *tls_addr_s, size_t capacity);
    +
    222 
    +
    238 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239  char *tcp_addr_s, size_t capacity);
    +
    240 
    +
    256 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257  char *sctp_addr_s, size_t capacity);
    +
    258 
    +
    273 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274 
    +
    289 int 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..13e96adab --- /dev/null +++ b/doc/v1.3.1/xcm__attr_8h.html @@ -0,0 +1,614 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..ac2dc371e --- /dev/null +++ b/doc/v1.3.1/xcm__attr_8h_source.html @@ -0,0 +1,139 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89  const char *value);
    +
    90 
    +
    116 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118 
    +
    135 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136  bool *value);
    +
    137 
    +
    154 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155  int64_t *value);
    +
    156 
    +
    175 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176  char *value, size_t capacity);
    +
    177 
    +
    179 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180  void *value, size_t value_len, void *cb_data);
    +
    181 
    +
    195 void 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..10f374e1f --- /dev/null +++ b/doc/v1.3.1/xcm__attr__map_8h.html @@ -0,0 +1,766 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..18929a9b9 --- /dev/null +++ b/doc/v1.3.1/xcm__attr__map_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name,
    +
    81  bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name,
    +
    95  int64_t attr_value);
    +
    96 
    +
    97 
    +
    107 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108  const char *attr_name,
    +
    109  const char *attr_value);
    +
    110 
    +
    111 
    +
    128 const 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 
    +
    148 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149  const char *attr_name);
    +
    150 
    +
    151 
    +
    166 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167  const char *attr_name);
    +
    168 
    +
    169 
    +
    184 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185  const char *attr_name);
    +
    186 
    +
    195 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196  const char *attr_name);
    +
    197 
    +
    198 
    +
    207 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208 
    +
    209 
    +
    217 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218 
    +
    219 
    +
    223 typedef 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 
    +
    242 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243  xcm_attr_map_foreach_cb cb, void *user);
    +
    244 
    +
    245 
    +
    254 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255  const struct xcm_attr_map *attr_map_b);
    +
    256 
    +
    265 void 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)
    +
    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_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 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 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..c766019b5 --- /dev/null +++ b/doc/v1.3.1/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..c40cd2cf0 --- /dev/null +++ b/doc/v1.3.1/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..45b0f9e03 --- /dev/null +++ b/doc/v1.3.1/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..f2f5f973a --- /dev/null +++ b/doc/v1.3.1/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..0a0a42a26 --- /dev/null +++ b/doc/v1.3.1/xcm__version_8h.html @@ -0,0 +1,266 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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.3.1/xcm__version_8h_source.html b/doc/v1.3.1/xcm__version_8h_source.html new file mode 100644 index 000000000..7a01da1e9 --- /dev/null +++ b/doc/v1.3.1/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    59 unsigned int xcm_version_major(void);
    +
    60 
    +
    67 unsigned int xcm_version_minor(void);
    +
    68 
    +
    74 unsigned int xcm_version_patch(void);
    +
    75 
    +
    84 const char *xcm_version(void);
    +
    85 
    +
    91 unsigned int xcm_version_api_major(void);
    +
    92 
    +
    98 unsigned int xcm_version_api_minor(void);
    +
    99 
    +
    108 const char *xcm_version_api(void);
    +
    109 
    +
    110 #ifdef __cplusplus
    +
    111 }
    +
    112 #endif
    +
    113 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..b159dc8bd --- /dev/null +++ b/doc/v1.3.2/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/doc/v1.3.2/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/doc/v1.3.2/bdwn.png differ diff --git a/doc/v1.3.2/classes.html b/doc/v1.3.2/classes.html new file mode 100644 index 000000000..15b7d7ca7 --- /dev/null +++ b/doc/v1.3.2/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..4d17122a0 --- /dev/null +++ b/doc/v1.3.2/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,100 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/doc/v1.3.2/doc.png b/doc/v1.3.2/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/doc/v1.3.2/doc.png differ diff --git a/doc/v1.3.2/doxygen.css b/doc/v1.3.2/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/doc/v1.3.2/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doc/v1.3.2/doxygen.svg b/doc/v1.3.2/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/doc/v1.3.2/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.3.2/dynsections.js b/doc/v1.3.2/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/doc/v1.3.2/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/doc/v1.3.2/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/doc/v1.3.2/folderclosed.png differ diff --git a/doc/v1.3.2/folderopen.png b/doc/v1.3.2/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/doc/v1.3.2/folderopen.png differ diff --git a/doc/v1.3.2/functions.html b/doc/v1.3.2/functions.html new file mode 100644 index 000000000..8b800ac15 --- /dev/null +++ b/doc/v1.3.2/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..3125a64f7 --- /dev/null +++ b/doc/v1.3.2/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.3.2/globals.html b/doc/v1.3.2/globals.html new file mode 100644 index 000000000..1d4bba85e --- /dev/null +++ b/doc/v1.3.2/globals.html @@ -0,0 +1,302 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..bfe89e5fd --- /dev/null +++ b/doc/v1.3.2/globals_defs.html @@ -0,0 +1,111 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.3.2/globals_enum.html b/doc/v1.3.2/globals_enum.html new file mode 100644 index 000000000..e23c54325 --- /dev/null +++ b/doc/v1.3.2/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.3.2/globals_eval.html b/doc/v1.3.2/globals_eval.html new file mode 100644 index 000000000..3e7229c82 --- /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) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.3.2/globals_func.html b/doc/v1.3.2/globals_func.html new file mode 100644 index 000000000..2b0540e55 --- /dev/null +++ b/doc/v1.3.2/globals_func.html @@ -0,0 +1,242 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - 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..0c2385419 --- /dev/null +++ b/doc/v1.3.2/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + 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..0f08b4af0 --- /dev/null +++ b/doc/v1.3.2/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.3.2/group__lib__version.html b/doc/v1.3.2/group__lib__version.html new file mode 100644 index 000000000..7f0858a9b --- /dev/null +++ b/doc/v1.3.2/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.3.2/index.html b/doc/v1.3.2/index.html new file mode 100644 index 000000000..8ddd257fb --- /dev/null +++ b/doc/v1.3.2/index.html @@ -0,0 +1,557 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/doc/v1.3.2/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/doc/v1.3.2/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/doc/v1.3.2/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/doc/v1.3.2/modules.html new file mode 100644 index 000000000..75399f90c --- /dev/null +++ b/doc/v1.3.2/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/doc/v1.3.2/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..e1c7e12e8 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/doc/v1.3.2/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/doc/v1.3.2/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..7130f6379 --- /dev/null +++ b/doc/v1.3.2/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.3.2/search/all_1.html b/doc/v1.3.2/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/doc/v1.3.2/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..69f82ad46 --- /dev/null +++ b/doc/v1.3.2/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.3.2/search/all_2.html b/doc/v1.3.2/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/doc/v1.3.2/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ae6e4d753 --- /dev/null +++ b/doc/v1.3.2/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.3.2/search/all_3.html b/doc/v1.3.2/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/doc/v1.3.2/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..551054f77 --- /dev/null +++ b/doc/v1.3.2/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.3.2/search/all_4.html b/doc/v1.3.2/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/doc/v1.3.2/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..fd3d5a006 --- /dev/null +++ b/doc/v1.3.2/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.3.2/search/all_5.html b/doc/v1.3.2/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/doc/v1.3.2/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..16b2d8d7e --- /dev/null +++ b/doc/v1.3.2/search/all_5.js @@ -0,0 +1,87 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_8',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_9',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_10',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_11',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_12',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_13',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_14',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_15',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_16',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_17',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_18',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_19',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_20',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_21',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_22',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_23',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_24',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_25',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_26',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_27',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_28',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',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_5fint64_30',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_31',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_32',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_33',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_38',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_46',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_47',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_48',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_49',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_50',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_51',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',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_5fattr_5ftype_54',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_55',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_56',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_57',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_58',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_59',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_60',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_61',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_62',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_63',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_64',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_65',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_66',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_67',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_68',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_69',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_70',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_71',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_72',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_73',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_74',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_75',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_76',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_77',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_78',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_79',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_80',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_81',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_82',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_83',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_84',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_85',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_86',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_87',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_88',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_89',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.3.2/search/all_6.html b/doc/v1.3.2/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/doc/v1.3.2/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5debab10e --- /dev/null +++ b/doc/v1.3.2/search/all_6.js @@ -0,0 +1,119 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_14',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_15',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_16',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_17',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_18',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_19',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_20',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_21',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_22',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_23',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_24',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_25',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_26',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_27',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_28',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_29',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_30',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_31',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_32',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_33',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_34',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_35',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_36',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_37',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_38',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_39',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_40',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_41',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_51',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_59',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_60',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_61',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_62',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_63',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_84',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',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#a4d8d62a9625b49993b7d6ec03de8e765',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#ad52a0d86b7b5bf802835758cc9251e2e',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#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_98',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',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',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_109',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_110',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_111',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_112',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_113',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_114',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_115',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_116',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_117',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_118',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_119',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_120',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_121',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_122',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_123',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.3.2/search/classes_0.html b/doc/v1.3.2/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/doc/v1.3.2/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..468741d24 --- /dev/null +++ b/doc/v1.3.2/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_90',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_91',['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..a933eea1a --- /dev/null +++ b/doc/v1.3.2/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/doc/v1.3.2/search/defines_0.html b/doc/v1.3.2/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/doc/v1.3.2/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ed9b81242 --- /dev/null +++ b/doc/v1.3.2/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_166',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_167',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_168',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_169',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_170',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_171',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_172',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_173',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_174',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_175',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_176',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_177',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_178',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.3.2/search/enums_0.html b/doc/v1.3.2/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/doc/v1.3.2/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..623970eaa --- /dev/null +++ b/doc/v1.3.2/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_161',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.3.2/search/enumvalues_0.html b/doc/v1.3.2/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/doc/v1.3.2/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..bf116ee08 --- /dev/null +++ b/doc/v1.3.2/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_162',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_163',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_164',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_165',['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.html b/doc/v1.3.2/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/doc/v1.3.2/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..d46f54089 --- /dev/null +++ b/doc/v1.3.2/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_92',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_93',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_94',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_95',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_96',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_97',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/doc/v1.3.2/search/functions_0.html b/doc/v1.3.2/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/doc/v1.3.2/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..76fd95c5b --- /dev/null +++ b/doc/v1.3.2/search/functions_0.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['xcm_5faccept_98',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_99',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_100',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_101',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_102',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_103',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_104',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_105',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_106',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_107',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_108',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_109',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_110',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_111',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_112',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_113',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_114',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_115',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_116',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_117',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_118',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_119',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_120',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_121',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_122',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_123',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_124',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_125',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_126',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_127',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_128',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_129',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_130',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_131',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_132',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_133',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_134',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_135',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_136',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_137',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_138',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_139',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_140',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_141',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_142',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_143',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_144',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_145',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_146',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_147',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_148',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_149',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_150',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_151',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_152',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_153',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.3.2/search/groups_0.html b/doc/v1.3.2/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/doc/v1.3.2/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ee66bd8d9 --- /dev/null +++ b/doc/v1.3.2/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_238',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.3.2/search/groups_1.html b/doc/v1.3.2/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/doc/v1.3.2/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..73d61cda3 --- /dev/null +++ b/doc/v1.3.2/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_239',['Library Version',['../group__lib__version.html',1,'']]] +]; 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..03626f64a --- /dev/null +++ b/doc/v1.3.2/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/doc/v1.3.2/search/nomatches.html b/doc/v1.3.2/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/doc/v1.3.2/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/doc/v1.3.2/search/pages_0.html b/doc/v1.3.2/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/doc/v1.3.2/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..c122886e8 --- /dev/null +++ b/doc/v1.3.2/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_179',['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..9074198f8 --- /dev/null +++ b/doc/v1.3.2/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/doc/v1.3.2/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.3.2/search/typedefs_0.js b/doc/v1.3.2/search/typedefs_0.js new file mode 100644 index 000000000..c9347964e --- /dev/null +++ b/doc/v1.3.2/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_159',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_160',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/doc/v1.3.2/search/variables_0.html b/doc/v1.3.2/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/doc/v1.3.2/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.3.2/search/variables_0.js b/doc/v1.3.2/search/variables_0.js new file mode 100644 index 000000000..bbc532810 --- /dev/null +++ b/doc/v1.3.2/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_154',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.3.2/search/variables_1.html b/doc/v1.3.2/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/doc/v1.3.2/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.3.2/search/variables_1.js b/doc/v1.3.2/search/variables_1.js new file mode 100644 index 000000000..25a43a70b --- /dev/null +++ b/doc/v1.3.2/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_155',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.3.2/search/variables_2.html b/doc/v1.3.2/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/doc/v1.3.2/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.3.2/search/variables_2.js b/doc/v1.3.2/search/variables_2.js new file mode 100644 index 000000000..5313f9bd4 --- /dev/null +++ b/doc/v1.3.2/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_156',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_157',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.3.2/search/variables_3.html b/doc/v1.3.2/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/doc/v1.3.2/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.3.2/search/variables_3.js b/doc/v1.3.2/search/variables_3.js new file mode 100644 index 000000000..b8a64dacb --- /dev/null +++ b/doc/v1.3.2/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_158',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.3.2/server_accept.png b/doc/v1.3.2/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/doc/v1.3.2/server_accept.png differ diff --git a/doc/v1.3.2/splitbar.png b/doc/v1.3.2/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/doc/v1.3.2/splitbar.png differ diff --git a/doc/v1.3.2/structxcm__addr__host.html b/doc/v1.3.2/structxcm__addr__host.html new file mode 100644 index 000000000..da8b13b84 --- /dev/null +++ b/doc/v1.3.2/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..c0f97c917 --- /dev/null +++ b/doc/v1.3.2/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/doc/v1.3.2/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/doc/v1.3.2/xcm_8h.html b/doc/v1.3.2/xcm_8h.html new file mode 100644 index 000000000..8926c4730 --- /dev/null +++ b/doc/v1.3.2/xcm_8h.html @@ -0,0 +1,905 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..af5831673 --- /dev/null +++ b/doc/v1.3.2/xcm_8h_source.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1122 struct xcm_socket;
    +
    1123 
    +
    1174 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1175 
    +
    1197 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1198  const struct xcm_attr_map *attrs);
    +
    1199 
    +
    1230 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1231 
    +
    1247 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1248  const struct xcm_attr_map *attrs);
    +
    1249 
    +
    1266 int xcm_close(struct xcm_socket *socket);
    +
    1267 
    +
    1287 void xcm_cleanup(struct xcm_socket *socket);
    +
    1288 
    +
    1311 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1312 
    +
    1329 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1330  const struct xcm_attr_map *attrs);
    +
    1331 
    +
    1353 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1354 
    +
    1377 int 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 
    +
    1448 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1449 
    +
    1491 int xcm_fd(struct xcm_socket *socket);
    +
    1492 
    +
    1533 int xcm_finish(struct xcm_socket *socket);
    +
    1534 
    +
    1575 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1576 
    +
    1591 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1592 
    +
    1609 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1610 
    +
    1625 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..c016d43e4 --- /dev/null +++ b/doc/v1.3.2/xcm__addr_8h.html @@ -0,0 +1,940 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..bdc35fc6e --- /dev/null +++ b/doc/v1.3.2/xcm__addr_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    39 enum 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];
    +
    58  } addr;
    +
    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 
    +
    88 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89 
    +
    103 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104  uint16_t *port);
    +
    105 
    +
    119 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120  uint16_t *port);
    +
    121 
    +
    136 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137  uint16_t *port);
    +
    138 
    +
    153 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154  uint16_t *port);
    +
    155 
    +
    169 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170 
    +
    184 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185  size_t capacity);
    +
    186 
    +
    202 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203  char *utls_addr_s, size_t capacity);
    +
    204 
    +
    220 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221  char *tls_addr_s, size_t capacity);
    +
    222 
    +
    238 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239  char *tcp_addr_s, size_t capacity);
    +
    240 
    +
    256 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257  char *sctp_addr_s, size_t capacity);
    +
    258 
    +
    273 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274 
    +
    289 int 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..57104e279 --- /dev/null +++ b/doc/v1.3.2/xcm__attr_8h.html @@ -0,0 +1,614 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..ac39cc507 --- /dev/null +++ b/doc/v1.3.2/xcm__attr_8h_source.html @@ -0,0 +1,139 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89  const char *value);
    +
    90 
    +
    116 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118 
    +
    135 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136  bool *value);
    +
    137 
    +
    154 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155  int64_t *value);
    +
    156 
    +
    175 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176  char *value, size_t capacity);
    +
    177 
    +
    179 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180  void *value, size_t value_len, void *cb_data);
    +
    181 
    +
    195 void 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..d0aadbf82 --- /dev/null +++ b/doc/v1.3.2/xcm__attr__map_8h.html @@ -0,0 +1,766 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..8eb4c4194 --- /dev/null +++ b/doc/v1.3.2/xcm__attr__map_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name,
    +
    81  bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name,
    +
    95  int64_t attr_value);
    +
    96 
    +
    97 
    +
    107 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108  const char *attr_name,
    +
    109  const char *attr_value);
    +
    110 
    +
    111 
    +
    128 const 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 
    +
    148 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149  const char *attr_name);
    +
    150 
    +
    151 
    +
    166 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167  const char *attr_name);
    +
    168 
    +
    169 
    +
    184 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185  const char *attr_name);
    +
    186 
    +
    195 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196  const char *attr_name);
    +
    197 
    +
    198 
    +
    207 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208 
    +
    209 
    +
    217 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218 
    +
    219 
    +
    223 typedef 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 
    +
    242 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243  xcm_attr_map_foreach_cb cb, void *user);
    +
    244 
    +
    245 
    +
    254 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255  const struct xcm_attr_map *attr_map_b);
    +
    256 
    +
    265 void 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)
    +
    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_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 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 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..af4c85d89 --- /dev/null +++ b/doc/v1.3.2/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..1b4d0ff37 --- /dev/null +++ b/doc/v1.3.2/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..b96e54a44 --- /dev/null +++ b/doc/v1.3.2/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..e13547901 --- /dev/null +++ b/doc/v1.3.2/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..0a0a42a26 --- /dev/null +++ b/doc/v1.3.2/xcm__version_8h.html @@ -0,0 +1,266 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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.3.2/xcm__version_8h_source.html b/doc/v1.3.2/xcm__version_8h_source.html new file mode 100644 index 000000000..7a01da1e9 --- /dev/null +++ b/doc/v1.3.2/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    59 unsigned int xcm_version_major(void);
    +
    60 
    +
    67 unsigned int xcm_version_minor(void);
    +
    68 
    +
    74 unsigned int xcm_version_patch(void);
    +
    75 
    +
    84 const char *xcm_version(void);
    +
    85 
    +
    91 unsigned int xcm_version_api_major(void);
    +
    92 
    +
    98 unsigned int xcm_version_api_minor(void);
    +
    99 
    +
    108 const char *xcm_version_api(void);
    +
    109 
    +
    110 #ifdef __cplusplus
    +
    111 }
    +
    112 #endif
    +
    113 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..a475c8089 --- /dev/null +++ b/doc/v1.4.0/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/doc/v1.4.0/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/doc/v1.4.0/bdwn.png differ diff --git a/doc/v1.4.0/classes.html b/doc/v1.4.0/classes.html new file mode 100644 index 000000000..d27cc3b97 --- /dev/null +++ b/doc/v1.4.0/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..c2fd45e19 --- /dev/null +++ b/doc/v1.4.0/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,100 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/doc/v1.4.0/doc.png b/doc/v1.4.0/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/doc/v1.4.0/doc.png differ diff --git a/doc/v1.4.0/doxygen.css b/doc/v1.4.0/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/doc/v1.4.0/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doc/v1.4.0/doxygen.svg b/doc/v1.4.0/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/doc/v1.4.0/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.4.0/dynsections.js b/doc/v1.4.0/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/doc/v1.4.0/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/doc/v1.4.0/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/doc/v1.4.0/folderclosed.png differ diff --git a/doc/v1.4.0/folderopen.png b/doc/v1.4.0/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/doc/v1.4.0/folderopen.png differ diff --git a/doc/v1.4.0/functions.html b/doc/v1.4.0/functions.html new file mode 100644 index 000000000..63b816405 --- /dev/null +++ b/doc/v1.4.0/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..a660c4c69 --- /dev/null +++ b/doc/v1.4.0/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.4.0/globals.html b/doc/v1.4.0/globals.html new file mode 100644 index 000000000..1341111d5 --- /dev/null +++ b/doc/v1.4.0/globals.html @@ -0,0 +1,311 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..5c49365be --- /dev/null +++ b/doc/v1.4.0/globals_defs.html @@ -0,0 +1,114 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.4.0/globals_enum.html b/doc/v1.4.0/globals_enum.html new file mode 100644 index 000000000..ff722b555 --- /dev/null +++ b/doc/v1.4.0/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.4.0/globals_eval.html b/doc/v1.4.0/globals_eval.html new file mode 100644 index 000000000..060a7d3c1 --- /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) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.4.0/globals_func.html b/doc/v1.4.0/globals_func.html new file mode 100644 index 000000000..9e37c1d96 --- /dev/null +++ b/doc/v1.4.0/globals_func.html @@ -0,0 +1,248 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - 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..4b584d9b8 --- /dev/null +++ b/doc/v1.4.0/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + 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..0f08b4af0 --- /dev/null +++ b/doc/v1.4.0/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.4.0/group__lib__version.html b/doc/v1.4.0/group__lib__version.html new file mode 100644 index 000000000..7f0858a9b --- /dev/null +++ b/doc/v1.4.0/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.4.0/index.html b/doc/v1.4.0/index.html new file mode 100644 index 000000000..908e00426 --- /dev/null +++ b/doc/v1.4.0/index.html @@ -0,0 +1,607 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/doc/v1.4.0/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/doc/v1.4.0/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/doc/v1.4.0/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/doc/v1.4.0/modules.html new file mode 100644 index 000000000..75399f90c --- /dev/null +++ b/doc/v1.4.0/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/doc/v1.4.0/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..e1c7e12e8 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/doc/v1.4.0/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/doc/v1.4.0/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..7130f6379 --- /dev/null +++ b/doc/v1.4.0/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.4.0/search/all_1.html b/doc/v1.4.0/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/doc/v1.4.0/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..69f82ad46 --- /dev/null +++ b/doc/v1.4.0/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.4.0/search/all_2.html b/doc/v1.4.0/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/doc/v1.4.0/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ae6e4d753 --- /dev/null +++ b/doc/v1.4.0/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.4.0/search/all_3.html b/doc/v1.4.0/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/doc/v1.4.0/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..551054f77 --- /dev/null +++ b/doc/v1.4.0/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.4.0/search/all_4.html b/doc/v1.4.0/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/doc/v1.4.0/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..fd3d5a006 --- /dev/null +++ b/doc/v1.4.0/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.4.0/search/all_5.html b/doc/v1.4.0/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/doc/v1.4.0/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..4b87832de --- /dev/null +++ b/doc/v1.4.0/search/all_5.js @@ -0,0 +1,90 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_8',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_9',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_10',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_11',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_12',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_13',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_14',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_15',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_16',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_17',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_18',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_19',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_20',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_21',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_22',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_23',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_24',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_25',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_26',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_27',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_28',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_29',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_30',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',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_5fint64_32',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_33',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_34',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_35',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_36',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_40',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_48',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_49',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_50',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_51',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_52',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_53',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_54',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_55',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_56',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_57',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_58',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_59',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_60',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_61',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_62',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_63',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_64',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_65',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_66',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_67',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_68',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_69',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_70',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_71',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_72',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_73',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_74',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_75',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_76',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_77',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_78',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_79',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_80',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_81',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_82',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_83',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_84',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_85',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_86',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_87',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_88',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_89',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_90',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_91',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_92',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.4.0/search/all_6.html b/doc/v1.4.0/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/doc/v1.4.0/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5debab10e --- /dev/null +++ b/doc/v1.4.0/search/all_6.js @@ -0,0 +1,119 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_14',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_15',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_16',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_17',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_18',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_19',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_20',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_21',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_22',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_23',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_24',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_25',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_26',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_27',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_28',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_29',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_30',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_31',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_32',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_33',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_34',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_35',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_36',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_37',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_38',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_39',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_40',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_41',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_51',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_59',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_60',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_61',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_62',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_63',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_84',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',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#a4d8d62a9625b49993b7d6ec03de8e765',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#ad52a0d86b7b5bf802835758cc9251e2e',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#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_98',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',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',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_109',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_110',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_111',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_112',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_113',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_114',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_115',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_116',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_117',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_118',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_119',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_120',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_121',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_122',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_123',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.4.0/search/classes_0.html b/doc/v1.4.0/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/doc/v1.4.0/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..d69a5ebf5 --- /dev/null +++ b/doc/v1.4.0/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_93',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_94',['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..a933eea1a --- /dev/null +++ b/doc/v1.4.0/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/doc/v1.4.0/search/defines_0.html b/doc/v1.4.0/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/doc/v1.4.0/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..3816dfd51 --- /dev/null +++ b/doc/v1.4.0/search/defines_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_171',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_172',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_173',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_174',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_175',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_176',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_177',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_178',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_179',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_180',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_181',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_182',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_183',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_184',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.4.0/search/enums_0.html b/doc/v1.4.0/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/doc/v1.4.0/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..54f7540ad --- /dev/null +++ b/doc/v1.4.0/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_166',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.4.0/search/enumvalues_0.html b/doc/v1.4.0/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/doc/v1.4.0/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..7986e5f66 --- /dev/null +++ b/doc/v1.4.0/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_167',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_168',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_169',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_170',['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.html b/doc/v1.4.0/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/doc/v1.4.0/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..197501694 --- /dev/null +++ b/doc/v1.4.0/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_95',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_96',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_97',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_98',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_99',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_100',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/doc/v1.4.0/search/functions_0.html b/doc/v1.4.0/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/doc/v1.4.0/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..2eb38b578 --- /dev/null +++ b/doc/v1.4.0/search/functions_0.js @@ -0,0 +1,61 @@ +var searchData= +[ + ['xcm_5faccept_101',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_102',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_103',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_104',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_105',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_106',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_107',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_108',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_109',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_110',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_111',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_112',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_113',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_114',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_115',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_116',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_117',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_118',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_119',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_120',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_121',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_122',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_123',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_124',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_125',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_126',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_127',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_128',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_129',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_130',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_131',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_132',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_133',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_134',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_135',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_136',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_137',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_138',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_139',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_140',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_141',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_142',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_143',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_144',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_145',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_146',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_147',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_148',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_149',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_150',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_151',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_152',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_153',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_154',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_155',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_156',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_157',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_158',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.4.0/search/groups_0.html b/doc/v1.4.0/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/doc/v1.4.0/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ee66bd8d9 --- /dev/null +++ b/doc/v1.4.0/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_238',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.4.0/search/groups_1.html b/doc/v1.4.0/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/doc/v1.4.0/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..73d61cda3 --- /dev/null +++ b/doc/v1.4.0/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_239',['Library Version',['../group__lib__version.html',1,'']]] +]; 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..03626f64a --- /dev/null +++ b/doc/v1.4.0/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/doc/v1.4.0/search/nomatches.html b/doc/v1.4.0/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/doc/v1.4.0/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/doc/v1.4.0/search/pages_0.html b/doc/v1.4.0/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/doc/v1.4.0/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..60011d008 --- /dev/null +++ b/doc/v1.4.0/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_185',['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..9074198f8 --- /dev/null +++ b/doc/v1.4.0/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/doc/v1.4.0/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.4.0/search/typedefs_0.js b/doc/v1.4.0/search/typedefs_0.js new file mode 100644 index 000000000..3015b744f --- /dev/null +++ b/doc/v1.4.0/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_164',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_165',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/doc/v1.4.0/search/variables_0.html b/doc/v1.4.0/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/doc/v1.4.0/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.4.0/search/variables_0.js b/doc/v1.4.0/search/variables_0.js new file mode 100644 index 000000000..bff86f5e1 --- /dev/null +++ b/doc/v1.4.0/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_159',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.4.0/search/variables_1.html b/doc/v1.4.0/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/doc/v1.4.0/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.4.0/search/variables_1.js b/doc/v1.4.0/search/variables_1.js new file mode 100644 index 000000000..3de59b8ca --- /dev/null +++ b/doc/v1.4.0/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_160',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.4.0/search/variables_2.html b/doc/v1.4.0/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/doc/v1.4.0/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.4.0/search/variables_2.js b/doc/v1.4.0/search/variables_2.js new file mode 100644 index 000000000..8883ac845 --- /dev/null +++ b/doc/v1.4.0/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_161',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_162',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.4.0/search/variables_3.html b/doc/v1.4.0/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/doc/v1.4.0/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.4.0/search/variables_3.js b/doc/v1.4.0/search/variables_3.js new file mode 100644 index 000000000..25978f346 --- /dev/null +++ b/doc/v1.4.0/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_163',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.4.0/server_accept.png b/doc/v1.4.0/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/doc/v1.4.0/server_accept.png differ diff --git a/doc/v1.4.0/splitbar.png b/doc/v1.4.0/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/doc/v1.4.0/splitbar.png differ diff --git a/doc/v1.4.0/structxcm__addr__host.html b/doc/v1.4.0/structxcm__addr__host.html new file mode 100644 index 000000000..d2ec34a78 --- /dev/null +++ b/doc/v1.4.0/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..ad2771e85 --- /dev/null +++ b/doc/v1.4.0/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/doc/v1.4.0/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/doc/v1.4.0/xcm_8h.html b/doc/v1.4.0/xcm_8h.html new file mode 100644 index 000000000..34fa54509 --- /dev/null +++ b/doc/v1.4.0/xcm_8h.html @@ -0,0 +1,907 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..cb5af4ac6 --- /dev/null +++ b/doc/v1.4.0/xcm_8h_source.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1238 struct xcm_socket;
    +
    1239 
    +
    1294 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1295 
    +
    1317 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1318  const struct xcm_attr_map *attrs);
    +
    1319 
    +
    1354 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1355 
    +
    1371 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1372  const struct xcm_attr_map *attrs);
    +
    1373 
    +
    1390 int xcm_close(struct xcm_socket *socket);
    +
    1391 
    +
    1411 void xcm_cleanup(struct xcm_socket *socket);
    +
    1412 
    +
    1435 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1436 
    +
    1453 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1454  const struct xcm_attr_map *attrs);
    +
    1455 
    +
    1478 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1479 
    +
    1503 int 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 
    +
    1574 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1575 
    +
    1617 int xcm_fd(struct xcm_socket *socket);
    +
    1618 
    +
    1659 int xcm_finish(struct xcm_socket *socket);
    +
    1660 
    +
    1701 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1702 
    +
    1717 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1718 
    +
    1735 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1736 
    +
    1751 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..eadf2b8b3 --- /dev/null +++ b/doc/v1.4.0/xcm__addr_8h.html @@ -0,0 +1,1070 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..c5e0d98f1 --- /dev/null +++ b/doc/v1.4.0/xcm__addr_8h_source.html @@ -0,0 +1,199 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    44 enum 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];
    +
    63  } addr;
    +
    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 
    +
    93 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94 
    +
    108 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109  uint16_t *port);
    +
    110 
    +
    124 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125  uint16_t *port);
    +
    126 
    +
    141 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142  uint16_t *port);
    +
    143 
    +
    158 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159  uint16_t *port);
    +
    160 
    +
    174 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175 
    +
    189 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190  size_t capacity);
    +
    191 
    +
    205 int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206  uint16_t *port);
    +
    207 
    +
    223 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224  char *utls_addr_s, size_t capacity);
    +
    225 
    +
    241 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242  char *tls_addr_s, size_t capacity);
    +
    243 
    +
    259 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260  char *tcp_addr_s, size_t capacity);
    +
    261 
    +
    277 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278  char *sctp_addr_s, size_t capacity);
    +
    279 
    +
    294 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295 
    +
    310 int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311 
    +
    327 int 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..1d522a17b --- /dev/null +++ b/doc/v1.4.0/xcm__attr_8h.html @@ -0,0 +1,614 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..70bc91e57 --- /dev/null +++ b/doc/v1.4.0/xcm__attr_8h_source.html @@ -0,0 +1,139 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89  const char *value);
    +
    90 
    +
    116 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118 
    +
    135 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136  bool *value);
    +
    137 
    +
    154 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155  int64_t *value);
    +
    156 
    +
    175 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176  char *value, size_t capacity);
    +
    177 
    +
    179 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180  void *value, size_t value_len, void *cb_data);
    +
    181 
    +
    195 void 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..372d4675c --- /dev/null +++ b/doc/v1.4.0/xcm__attr__map_8h.html @@ -0,0 +1,766 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..c8847faa1 --- /dev/null +++ b/doc/v1.4.0/xcm__attr__map_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name,
    +
    81  bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name,
    +
    95  int64_t attr_value);
    +
    96 
    +
    97 
    +
    107 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108  const char *attr_name,
    +
    109  const char *attr_value);
    +
    110 
    +
    111 
    +
    128 const 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 
    +
    148 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149  const char *attr_name);
    +
    150 
    +
    151 
    +
    166 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167  const char *attr_name);
    +
    168 
    +
    169 
    +
    184 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185  const char *attr_name);
    +
    186 
    +
    195 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196  const char *attr_name);
    +
    197 
    +
    198 
    +
    207 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208 
    +
    209 
    +
    217 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218 
    +
    219 
    +
    223 typedef 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 
    +
    242 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243  xcm_attr_map_foreach_cb cb, void *user);
    +
    244 
    +
    245 
    +
    254 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255  const struct xcm_attr_map *attr_map_b);
    +
    256 
    +
    265 void 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)
    +
    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_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 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 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..058e0f225 --- /dev/null +++ b/doc/v1.4.0/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..b40f48359 --- /dev/null +++ b/doc/v1.4.0/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..152f4f33d --- /dev/null +++ b/doc/v1.4.0/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..fe9de39a3 --- /dev/null +++ b/doc/v1.4.0/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..0a0a42a26 --- /dev/null +++ b/doc/v1.4.0/xcm__version_8h.html @@ -0,0 +1,266 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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.4.0/xcm__version_8h_source.html b/doc/v1.4.0/xcm__version_8h_source.html new file mode 100644 index 000000000..7a01da1e9 --- /dev/null +++ b/doc/v1.4.0/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    59 unsigned int xcm_version_major(void);
    +
    60 
    +
    67 unsigned int xcm_version_minor(void);
    +
    68 
    +
    74 unsigned int xcm_version_patch(void);
    +
    75 
    +
    84 const char *xcm_version(void);
    +
    85 
    +
    91 unsigned int xcm_version_api_major(void);
    +
    92 
    +
    98 unsigned int xcm_version_api_minor(void);
    +
    99 
    +
    108 const char *xcm_version_api(void);
    +
    109 
    +
    110 #ifdef __cplusplus
    +
    111 }
    +
    112 #endif
    +
    113 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..d97deba1b --- /dev/null +++ b/doc/v1.4.1/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/doc/v1.4.1/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/doc/v1.4.1/bdwn.png differ diff --git a/doc/v1.4.1/classes.html b/doc/v1.4.1/classes.html new file mode 100644 index 000000000..4a755a292 --- /dev/null +++ b/doc/v1.4.1/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..97076ec2b --- /dev/null +++ b/doc/v1.4.1/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,100 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/doc/v1.4.1/doc.png b/doc/v1.4.1/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/doc/v1.4.1/doc.png differ diff --git a/doc/v1.4.1/doxygen.css b/doc/v1.4.1/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/doc/v1.4.1/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doc/v1.4.1/doxygen.svg b/doc/v1.4.1/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/doc/v1.4.1/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.4.1/dynsections.js b/doc/v1.4.1/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/doc/v1.4.1/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/doc/v1.4.1/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/doc/v1.4.1/folderclosed.png differ diff --git a/doc/v1.4.1/folderopen.png b/doc/v1.4.1/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/doc/v1.4.1/folderopen.png differ diff --git a/doc/v1.4.1/functions.html b/doc/v1.4.1/functions.html new file mode 100644 index 000000000..a85035058 --- /dev/null +++ b/doc/v1.4.1/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..b75c26623 --- /dev/null +++ b/doc/v1.4.1/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.4.1/globals.html b/doc/v1.4.1/globals.html new file mode 100644 index 000000000..0a6ed42f5 --- /dev/null +++ b/doc/v1.4.1/globals.html @@ -0,0 +1,314 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..63ded41af --- /dev/null +++ b/doc/v1.4.1/globals_defs.html @@ -0,0 +1,114 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.4.1/globals_enum.html b/doc/v1.4.1/globals_enum.html new file mode 100644 index 000000000..338bdfd19 --- /dev/null +++ b/doc/v1.4.1/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.4.1/globals_eval.html b/doc/v1.4.1/globals_eval.html new file mode 100644 index 000000000..a0ddf04d9 --- /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) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.4.1/globals_func.html b/doc/v1.4.1/globals_func.html new file mode 100644 index 000000000..37d612a2b --- /dev/null +++ b/doc/v1.4.1/globals_func.html @@ -0,0 +1,251 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - 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..3c2c9be50 --- /dev/null +++ b/doc/v1.4.1/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + 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..0f08b4af0 --- /dev/null +++ b/doc/v1.4.1/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.4.1/group__lib__version.html b/doc/v1.4.1/group__lib__version.html new file mode 100644 index 000000000..7f0858a9b --- /dev/null +++ b/doc/v1.4.1/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.4.1/index.html b/doc/v1.4.1/index.html new file mode 100644 index 000000000..1e5fedd86 --- /dev/null +++ b/doc/v1.4.1/index.html @@ -0,0 +1,615 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/doc/v1.4.1/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/doc/v1.4.1/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/doc/v1.4.1/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/doc/v1.4.1/modules.html new file mode 100644 index 000000000..75399f90c --- /dev/null +++ b/doc/v1.4.1/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/doc/v1.4.1/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..e1c7e12e8 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/doc/v1.4.1/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/doc/v1.4.1/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..7130f6379 --- /dev/null +++ b/doc/v1.4.1/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.4.1/search/all_1.html b/doc/v1.4.1/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/doc/v1.4.1/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..69f82ad46 --- /dev/null +++ b/doc/v1.4.1/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.4.1/search/all_2.html b/doc/v1.4.1/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/doc/v1.4.1/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ae6e4d753 --- /dev/null +++ b/doc/v1.4.1/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.4.1/search/all_3.html b/doc/v1.4.1/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/doc/v1.4.1/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..551054f77 --- /dev/null +++ b/doc/v1.4.1/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.4.1/search/all_4.html b/doc/v1.4.1/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/doc/v1.4.1/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..fd3d5a006 --- /dev/null +++ b/doc/v1.4.1/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.4.1/search/all_5.html b/doc/v1.4.1/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/doc/v1.4.1/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..2976ec53a --- /dev/null +++ b/doc/v1.4.1/search/all_5.js @@ -0,0 +1,91 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_8',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_9',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_10',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_11',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_12',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_13',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_14',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_15',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_16',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_17',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_18',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_19',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_20',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_21',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_22',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_23',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_24',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_25',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_26',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_27',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_28',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_29',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_30',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',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_5fint64_32',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_33',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_34',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['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_5fbool_37',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_38',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_39',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_40',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_41',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_42',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_43',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_44',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_45',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_46',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_47',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_48',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_49',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_50',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_51',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_52',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_53',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_54',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_55',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_56',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_57',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_58',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_59',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_60',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_61',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_62',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_63',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_64',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_65',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_66',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_67',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_68',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_69',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_70',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_71',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_72',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_73',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_74',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_75',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_76',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_77',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_78',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_79',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_80',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_81',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_82',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_83',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_84',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_85',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_86',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_87',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_88',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_89',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_90',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_91',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_92',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_93',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.4.1/search/all_6.html b/doc/v1.4.1/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/doc/v1.4.1/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5debab10e --- /dev/null +++ b/doc/v1.4.1/search/all_6.js @@ -0,0 +1,119 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_14',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_15',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_16',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_17',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_18',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_19',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_20',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_21',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_22',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_23',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_24',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_25',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_26',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_27',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_28',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_29',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_30',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_31',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_32',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_33',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_34',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_35',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_36',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_37',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_38',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_39',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_40',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_41',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_51',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_59',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_60',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_61',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_62',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_63',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_84',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',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#a4d8d62a9625b49993b7d6ec03de8e765',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#ad52a0d86b7b5bf802835758cc9251e2e',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#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_98',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',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',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_109',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_110',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_111',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_112',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_113',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_114',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_115',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_116',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_117',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_118',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_119',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_120',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_121',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_122',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_123',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.4.1/search/classes_0.html b/doc/v1.4.1/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/doc/v1.4.1/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..240849e0c --- /dev/null +++ b/doc/v1.4.1/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_94',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_95',['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..a933eea1a --- /dev/null +++ b/doc/v1.4.1/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/doc/v1.4.1/search/defines_0.html b/doc/v1.4.1/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/doc/v1.4.1/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..c0aa0f62c --- /dev/null +++ b/doc/v1.4.1/search/defines_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_173',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_174',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_175',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_176',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_177',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_178',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_179',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_180',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_181',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_182',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_183',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_184',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_185',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_186',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.4.1/search/enums_0.html b/doc/v1.4.1/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/doc/v1.4.1/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..606b2c27d --- /dev/null +++ b/doc/v1.4.1/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_168',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.4.1/search/enumvalues_0.html b/doc/v1.4.1/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/doc/v1.4.1/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..b6cd1e216 --- /dev/null +++ b/doc/v1.4.1/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_169',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_170',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_171',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_172',['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.html b/doc/v1.4.1/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/doc/v1.4.1/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..0edf827ec --- /dev/null +++ b/doc/v1.4.1/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_96',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_97',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_98',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_99',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_100',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_101',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/doc/v1.4.1/search/functions_0.html b/doc/v1.4.1/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/doc/v1.4.1/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..debccd7e3 --- /dev/null +++ b/doc/v1.4.1/search/functions_0.js @@ -0,0 +1,62 @@ +var searchData= +[ + ['xcm_5faccept_102',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_103',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_104',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_105',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_106',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_107',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_108',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_109',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_110',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_111',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_112',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_113',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_114',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_115',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_116',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_117',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_118',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_119',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_120',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_121',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_122',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_123',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_124',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_125',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_126',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_127',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_128',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_129',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_130',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_131',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_132',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_133',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_134',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_135',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_136',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_137',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_138',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_139',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_140',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_141',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_142',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_143',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_144',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_145',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_146',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_147',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_148',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_149',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_150',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_151',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_152',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_153',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_154',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_155',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_156',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_157',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_158',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_159',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_160',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.4.1/search/groups_0.html b/doc/v1.4.1/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/doc/v1.4.1/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ee66bd8d9 --- /dev/null +++ b/doc/v1.4.1/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_238',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.4.1/search/groups_1.html b/doc/v1.4.1/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/doc/v1.4.1/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..73d61cda3 --- /dev/null +++ b/doc/v1.4.1/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_239',['Library Version',['../group__lib__version.html',1,'']]] +]; 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..03626f64a --- /dev/null +++ b/doc/v1.4.1/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/doc/v1.4.1/search/nomatches.html b/doc/v1.4.1/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/doc/v1.4.1/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/doc/v1.4.1/search/pages_0.html b/doc/v1.4.1/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/doc/v1.4.1/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..b57e0eb10 --- /dev/null +++ b/doc/v1.4.1/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_187',['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..9074198f8 --- /dev/null +++ b/doc/v1.4.1/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/doc/v1.4.1/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.4.1/search/typedefs_0.js b/doc/v1.4.1/search/typedefs_0.js new file mode 100644 index 000000000..53403558f --- /dev/null +++ b/doc/v1.4.1/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_166',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_167',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/doc/v1.4.1/search/variables_0.html b/doc/v1.4.1/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/doc/v1.4.1/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.4.1/search/variables_0.js b/doc/v1.4.1/search/variables_0.js new file mode 100644 index 000000000..2b0944ffc --- /dev/null +++ b/doc/v1.4.1/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_161',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.4.1/search/variables_1.html b/doc/v1.4.1/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/doc/v1.4.1/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.4.1/search/variables_1.js b/doc/v1.4.1/search/variables_1.js new file mode 100644 index 000000000..91e927a68 --- /dev/null +++ b/doc/v1.4.1/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_162',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.4.1/search/variables_2.html b/doc/v1.4.1/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/doc/v1.4.1/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.4.1/search/variables_2.js b/doc/v1.4.1/search/variables_2.js new file mode 100644 index 000000000..3e010bbeb --- /dev/null +++ b/doc/v1.4.1/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_163',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_164',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.4.1/search/variables_3.html b/doc/v1.4.1/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/doc/v1.4.1/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.4.1/search/variables_3.js b/doc/v1.4.1/search/variables_3.js new file mode 100644 index 000000000..1cca1c7d5 --- /dev/null +++ b/doc/v1.4.1/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_165',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.4.1/server_accept.png b/doc/v1.4.1/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/doc/v1.4.1/server_accept.png differ diff --git a/doc/v1.4.1/splitbar.png b/doc/v1.4.1/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/doc/v1.4.1/splitbar.png differ diff --git a/doc/v1.4.1/structxcm__addr__host.html b/doc/v1.4.1/structxcm__addr__host.html new file mode 100644 index 000000000..f0d08c99d --- /dev/null +++ b/doc/v1.4.1/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..1efde5b8e --- /dev/null +++ b/doc/v1.4.1/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/doc/v1.4.1/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/doc/v1.4.1/xcm_8h.html b/doc/v1.4.1/xcm_8h.html new file mode 100644 index 000000000..7f80e6588 --- /dev/null +++ b/doc/v1.4.1/xcm_8h.html @@ -0,0 +1,908 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..1e180b7a1 --- /dev/null +++ b/doc/v1.4.1/xcm_8h_source.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1253 struct xcm_socket;
    +
    1254 
    +
    1307 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1308 
    +
    1330 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1331  const struct xcm_attr_map *attrs);
    +
    1332 
    +
    1368 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1369 
    +
    1385 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1386  const struct xcm_attr_map *attrs);
    +
    1387 
    +
    1404 int xcm_close(struct xcm_socket *socket);
    +
    1405 
    +
    1425 void xcm_cleanup(struct xcm_socket *socket);
    +
    1426 
    +
    1445 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1446 
    +
    1466 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1467  const struct xcm_attr_map *attrs);
    +
    1468 
    +
    1491 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1492 
    +
    1516 int 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 
    +
    1587 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1588 
    +
    1630 int xcm_fd(struct xcm_socket *socket);
    +
    1631 
    +
    1676 int xcm_finish(struct xcm_socket *socket);
    +
    1677 
    +
    1718 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1719 
    +
    1734 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1735 
    +
    1752 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1753 
    +
    1768 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..08c0b243d --- /dev/null +++ b/doc/v1.4.1/xcm__addr_8h.html @@ -0,0 +1,1070 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..bab138003 --- /dev/null +++ b/doc/v1.4.1/xcm__addr_8h_source.html @@ -0,0 +1,199 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    44 enum 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];
    +
    63  } addr;
    +
    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 
    +
    93 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94 
    +
    108 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109  uint16_t *port);
    +
    110 
    +
    124 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125  uint16_t *port);
    +
    126 
    +
    141 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142  uint16_t *port);
    +
    143 
    +
    158 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159  uint16_t *port);
    +
    160 
    +
    174 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175 
    +
    189 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190  size_t capacity);
    +
    191 
    +
    205 int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206  uint16_t *port);
    +
    207 
    +
    223 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224  char *utls_addr_s, size_t capacity);
    +
    225 
    +
    241 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242  char *tls_addr_s, size_t capacity);
    +
    243 
    +
    259 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260  char *tcp_addr_s, size_t capacity);
    +
    261 
    +
    277 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278  char *sctp_addr_s, size_t capacity);
    +
    279 
    +
    294 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295 
    +
    310 int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311 
    +
    327 int 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..97b5daefe --- /dev/null +++ b/doc/v1.4.1/xcm__attr_8h.html @@ -0,0 +1,614 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..0f7b12202 --- /dev/null +++ b/doc/v1.4.1/xcm__attr_8h_source.html @@ -0,0 +1,139 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89  const char *value);
    +
    90 
    +
    116 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118 
    +
    135 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136  bool *value);
    +
    137 
    +
    154 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155  int64_t *value);
    +
    156 
    +
    175 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176  char *value, size_t capacity);
    +
    177 
    +
    179 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180  void *value, size_t value_len, void *cb_data);
    +
    181 
    +
    195 void 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..fb2c0c55f --- /dev/null +++ b/doc/v1.4.1/xcm__attr__map_8h.html @@ -0,0 +1,805 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..ea8552d0b --- /dev/null +++ b/doc/v1.4.1/xcm__attr__map_8h_source.html @@ -0,0 +1,194 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name,
    +
    81  bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name,
    +
    95  int64_t attr_value);
    +
    96 
    +
    97 
    +
    107 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108  const char *attr_name,
    +
    109  const char *attr_value);
    +
    110 
    +
    111 
    +
    121 void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    122  const struct xcm_attr_map *src_map);
    +
    123 
    +
    124 
    +
    141 const 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 
    +
    161 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    162  const char *attr_name);
    +
    163 
    +
    164 
    +
    179 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    180  const char *attr_name);
    +
    181 
    +
    182 
    +
    197 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    198  const char *attr_name);
    +
    199 
    +
    208 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    209  const char *attr_name);
    +
    210 
    +
    211 
    +
    220 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    221 
    +
    222 
    +
    230 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    231 
    +
    232 
    +
    236 typedef 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 
    +
    255 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    256  xcm_attr_map_foreach_cb cb, void *user);
    +
    257 
    +
    258 
    +
    267 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    268  const struct xcm_attr_map *attr_map_b);
    +
    269 
    +
    278 void 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)
    +
    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)
    +
    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 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 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..b42a8ad9d --- /dev/null +++ b/doc/v1.4.1/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..cbac4af35 --- /dev/null +++ b/doc/v1.4.1/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..d75d482a3 --- /dev/null +++ b/doc/v1.4.1/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..945ed6612 --- /dev/null +++ b/doc/v1.4.1/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..0a0a42a26 --- /dev/null +++ b/doc/v1.4.1/xcm__version_8h.html @@ -0,0 +1,266 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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.4.1/xcm__version_8h_source.html b/doc/v1.4.1/xcm__version_8h_source.html new file mode 100644 index 000000000..7a01da1e9 --- /dev/null +++ b/doc/v1.4.1/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    59 unsigned int xcm_version_major(void);
    +
    60 
    +
    67 unsigned int xcm_version_minor(void);
    +
    68 
    +
    74 unsigned int xcm_version_patch(void);
    +
    75 
    +
    84 const char *xcm_version(void);
    +
    85 
    +
    91 unsigned int xcm_version_api_major(void);
    +
    92 
    +
    98 unsigned int xcm_version_api_minor(void);
    +
    99 
    +
    108 const char *xcm_version_api(void);
    +
    109 
    +
    110 #ifdef __cplusplus
    +
    111 }
    +
    112 #endif
    +
    113 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..d1fa34d6c --- /dev/null +++ b/doc/v1.5.0/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/doc/v1.5.0/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/doc/v1.5.0/bdwn.png differ diff --git a/doc/v1.5.0/classes.html b/doc/v1.5.0/classes.html new file mode 100644 index 000000000..8a18ed058 --- /dev/null +++ b/doc/v1.5.0/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..ba4d4736c --- /dev/null +++ b/doc/v1.5.0/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,103 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    file  xcm_version.h [code]
     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.png b/doc/v1.5.0/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/doc/v1.5.0/doc.png differ diff --git a/doc/v1.5.0/doxygen.css b/doc/v1.5.0/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/doc/v1.5.0/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doc/v1.5.0/doxygen.svg b/doc/v1.5.0/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/doc/v1.5.0/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.5.0/dynsections.js b/doc/v1.5.0/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/doc/v1.5.0/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/doc/v1.5.0/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/doc/v1.5.0/folderclosed.png differ diff --git a/doc/v1.5.0/folderopen.png b/doc/v1.5.0/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/doc/v1.5.0/folderopen.png differ diff --git a/doc/v1.5.0/functions.html b/doc/v1.5.0/functions.html new file mode 100644 index 000000000..10934bcbe --- /dev/null +++ b/doc/v1.5.0/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..2a784c1d5 --- /dev/null +++ b/doc/v1.5.0/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.5.0/globals.html b/doc/v1.5.0/globals.html new file mode 100644 index 000000000..7b60787cd --- /dev/null +++ b/doc/v1.5.0/globals.html @@ -0,0 +1,356 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..600fa3cfb --- /dev/null +++ b/doc/v1.5.0/globals_defs.html @@ -0,0 +1,135 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.5.0/globals_enum.html b/doc/v1.5.0/globals_enum.html new file mode 100644 index 000000000..34f484aa4 --- /dev/null +++ b/doc/v1.5.0/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.5.0/globals_eval.html b/doc/v1.5.0/globals_eval.html new file mode 100644 index 000000000..717bfdf92 --- /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) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.5.0/globals_func.html b/doc/v1.5.0/globals_func.html new file mode 100644 index 000000000..4c5ea6101 --- /dev/null +++ b/doc/v1.5.0/globals_func.html @@ -0,0 +1,272 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - 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..3c9aab0d9 --- /dev/null +++ b/doc/v1.5.0/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + 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..0f08b4af0 --- /dev/null +++ b/doc/v1.5.0/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.5.0/group__lib__version.html b/doc/v1.5.0/group__lib__version.html new file mode 100644 index 000000000..7f0858a9b --- /dev/null +++ b/doc/v1.5.0/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.5.0/index.html b/doc/v1.5.0/index.html new file mode 100644 index 000000000..217c61feb --- /dev/null +++ b/doc/v1.5.0/index.html @@ -0,0 +1,621 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/doc/v1.5.0/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/doc/v1.5.0/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/doc/v1.5.0/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/doc/v1.5.0/modules.html new file mode 100644 index 000000000..75399f90c --- /dev/null +++ b/doc/v1.5.0/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/doc/v1.5.0/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..e1c7e12e8 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/doc/v1.5.0/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/doc/v1.5.0/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..7130f6379 --- /dev/null +++ b/doc/v1.5.0/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.5.0/search/all_1.html b/doc/v1.5.0/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/doc/v1.5.0/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..69f82ad46 --- /dev/null +++ b/doc/v1.5.0/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.5.0/search/all_2.html b/doc/v1.5.0/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/doc/v1.5.0/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ae6e4d753 --- /dev/null +++ b/doc/v1.5.0/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.5.0/search/all_3.html b/doc/v1.5.0/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/doc/v1.5.0/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..551054f77 --- /dev/null +++ b/doc/v1.5.0/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.5.0/search/all_4.html b/doc/v1.5.0/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/doc/v1.5.0/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..fd3d5a006 --- /dev/null +++ b/doc/v1.5.0/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.5.0/search/all_5.html b/doc/v1.5.0/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/doc/v1.5.0/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5273f9abc --- /dev/null +++ b/doc/v1.5.0/search/all_5.js @@ -0,0 +1,106 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_8',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_9',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_10',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_11',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_12',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_13',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_14',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_15',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_16',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_17',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_18',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_19',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_20',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_21',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_22',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_23',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_24',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_25',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_26',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_27',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_28',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_29',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_30',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',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_5fint64_32',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_33',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_34',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['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_5fbool_37',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_38',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_39',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_40',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_41',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_42',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_43',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_44',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_45',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_46',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_47',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_48',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_49',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_50',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_51',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_52',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_53',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_54',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_55',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_56',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_57',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_58',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_59',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_60',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_61',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_62',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_63',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_64',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_65',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_66',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_67',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_68',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_69',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_70',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_71',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_72',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_73',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_74',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_75',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_76',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_77',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_78',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_79',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_80',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_81',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_82',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_83',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_84',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_85',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_86',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_87',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_88',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_89',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_90',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_91',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_92',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_93',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_94',['XCM_VERSION',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_95',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_96',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_97',['XCM_VERSION_API',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_98',['XCM_VERSION_API_MAJOR',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_99',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_100',['XCM_VERSION_API_MINOR',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_101',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_102',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_103',['XCM_VERSION_MAJOR',['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_104',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_105',['XCM_VERSION_MINOR',['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_106',['XCM_VERSION_PATCH',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_107',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_108',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.5.0/search/all_6.html b/doc/v1.5.0/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/doc/v1.5.0/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5debab10e --- /dev/null +++ b/doc/v1.5.0/search/all_6.js @@ -0,0 +1,119 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_14',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_15',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_16',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_17',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_18',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_19',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_20',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_21',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_22',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_23',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_24',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_25',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_26',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_27',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_28',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_29',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_30',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_31',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_32',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_33',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_34',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_35',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_36',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_37',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_38',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_39',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_40',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_41',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_51',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_59',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_60',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_61',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_62',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_63',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_84',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',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#a4d8d62a9625b49993b7d6ec03de8e765',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#ad52a0d86b7b5bf802835758cc9251e2e',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#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_98',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',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',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_109',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_110',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_111',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_112',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_113',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_114',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_115',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_116',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_117',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_118',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_119',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_120',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_121',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_122',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_123',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.5.0/search/classes_0.html b/doc/v1.5.0/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/doc/v1.5.0/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..a2e56ee61 --- /dev/null +++ b/doc/v1.5.0/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_109',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_110',['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..a933eea1a --- /dev/null +++ b/doc/v1.5.0/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/doc/v1.5.0/search/defines_0.html b/doc/v1.5.0/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/doc/v1.5.0/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..e8b050945 --- /dev/null +++ b/doc/v1.5.0/search/defines_0.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_196',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_197',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_198',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_199',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_200',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_201',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_202',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_203',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_204',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_205',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_206',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_207',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_208',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_209',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_210',['XCM_VERSION',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_211',['XCM_VERSION_API',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_212',['XCM_VERSION_API_MAJOR',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_213',['XCM_VERSION_API_MINOR',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_214',['XCM_VERSION_MAJOR',['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_215',['XCM_VERSION_MINOR',['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_216',['XCM_VERSION_PATCH',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]] +]; diff --git a/doc/v1.5.0/search/enums_0.html b/doc/v1.5.0/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/doc/v1.5.0/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..14e43419a --- /dev/null +++ b/doc/v1.5.0/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_191',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.5.0/search/enumvalues_0.html b/doc/v1.5.0/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/doc/v1.5.0/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..47eaf0ba8 --- /dev/null +++ b/doc/v1.5.0/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_192',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_193',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_194',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_195',['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.html b/doc/v1.5.0/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/doc/v1.5.0/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..49cc3f564 --- /dev/null +++ b/doc/v1.5.0/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_111',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_112',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_113',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_114',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_115',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_116',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_117',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/doc/v1.5.0/search/functions_0.html b/doc/v1.5.0/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/doc/v1.5.0/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..0df50007a --- /dev/null +++ b/doc/v1.5.0/search/functions_0.js @@ -0,0 +1,69 @@ +var searchData= +[ + ['xcm_5faccept_118',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_119',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_120',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_121',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_122',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_123',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_124',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_125',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_126',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_127',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_128',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_129',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_130',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_131',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_132',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_133',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_134',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_135',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_136',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_137',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_138',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_139',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_140',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_141',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_142',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_143',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_144',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_145',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_146',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_147',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_148',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_149',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_150',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_151',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_152',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_153',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_154',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_155',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_156',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_157',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_158',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_159',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_160',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_161',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_162',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_163',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_164',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_165',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_166',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_167',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_168',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_169',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_170',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_171',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_172',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_173',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_174',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_175',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_176',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_177',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_178',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_179',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_180',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_181',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_182',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_183',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.5.0/search/groups_0.html b/doc/v1.5.0/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/doc/v1.5.0/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ee66bd8d9 --- /dev/null +++ b/doc/v1.5.0/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_238',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.5.0/search/groups_1.html b/doc/v1.5.0/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/doc/v1.5.0/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..73d61cda3 --- /dev/null +++ b/doc/v1.5.0/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_239',['Library Version',['../group__lib__version.html',1,'']]] +]; 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..03626f64a --- /dev/null +++ b/doc/v1.5.0/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/doc/v1.5.0/search/nomatches.html b/doc/v1.5.0/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/doc/v1.5.0/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/doc/v1.5.0/search/pages_0.html b/doc/v1.5.0/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/doc/v1.5.0/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5b432bae5 --- /dev/null +++ b/doc/v1.5.0/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_217',['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..9074198f8 --- /dev/null +++ b/doc/v1.5.0/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/doc/v1.5.0/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.5.0/search/typedefs_0.js b/doc/v1.5.0/search/typedefs_0.js new file mode 100644 index 000000000..9c9abbd1f --- /dev/null +++ b/doc/v1.5.0/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_189',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_190',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/doc/v1.5.0/search/variables_0.html b/doc/v1.5.0/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/doc/v1.5.0/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.5.0/search/variables_0.js b/doc/v1.5.0/search/variables_0.js new file mode 100644 index 000000000..3205b1959 --- /dev/null +++ b/doc/v1.5.0/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_184',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.5.0/search/variables_1.html b/doc/v1.5.0/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/doc/v1.5.0/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.5.0/search/variables_1.js b/doc/v1.5.0/search/variables_1.js new file mode 100644 index 000000000..b2effea2c --- /dev/null +++ b/doc/v1.5.0/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_185',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.5.0/search/variables_2.html b/doc/v1.5.0/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/doc/v1.5.0/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.5.0/search/variables_2.js b/doc/v1.5.0/search/variables_2.js new file mode 100644 index 000000000..5cda77d5d --- /dev/null +++ b/doc/v1.5.0/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_186',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_187',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.5.0/search/variables_3.html b/doc/v1.5.0/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/doc/v1.5.0/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.5.0/search/variables_3.js b/doc/v1.5.0/search/variables_3.js new file mode 100644 index 000000000..df0550499 --- /dev/null +++ b/doc/v1.5.0/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_188',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.5.0/server_accept.png b/doc/v1.5.0/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/doc/v1.5.0/server_accept.png differ diff --git a/doc/v1.5.0/splitbar.png b/doc/v1.5.0/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/doc/v1.5.0/splitbar.png differ diff --git a/doc/v1.5.0/structxcm__addr__host.html b/doc/v1.5.0/structxcm__addr__host.html new file mode 100644 index 000000000..7bc15f46e --- /dev/null +++ b/doc/v1.5.0/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..874f0fa6a --- /dev/null +++ b/doc/v1.5.0/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/doc/v1.5.0/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/doc/v1.5.0/xcm_8h.html b/doc/v1.5.0/xcm_8h.html new file mode 100644 index 000000000..f02ae0653 --- /dev/null +++ b/doc/v1.5.0/xcm_8h.html @@ -0,0 +1,908 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..0065216e0 --- /dev/null +++ b/doc/v1.5.0/xcm_8h_source.html @@ -0,0 +1,164 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1254 struct xcm_socket;
    +
    1255 
    +
    1308 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1309 
    +
    1331 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1332  const struct xcm_attr_map *attrs);
    +
    1333 
    +
    1369 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1370 
    +
    1386 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1387  const struct xcm_attr_map *attrs);
    +
    1388 
    +
    1405 int xcm_close(struct xcm_socket *socket);
    +
    1406 
    +
    1426 void xcm_cleanup(struct xcm_socket *socket);
    +
    1427 
    +
    1446 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1447 
    +
    1467 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1468  const struct xcm_attr_map *attrs);
    +
    1469 
    +
    1492 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1493 
    +
    1517 int 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 
    +
    1588 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1589 
    +
    1631 int xcm_fd(struct xcm_socket *socket);
    +
    1632 
    +
    1677 int xcm_finish(struct xcm_socket *socket);
    +
    1678 
    +
    1719 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1720 
    +
    1735 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1736 
    +
    1753 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1754 
    +
    1769 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..266d220c3 --- /dev/null +++ b/doc/v1.5.0/xcm__addr_8h.html @@ -0,0 +1,1070 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..dcd6feb37 --- /dev/null +++ b/doc/v1.5.0/xcm__addr_8h_source.html @@ -0,0 +1,199 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    44 enum 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];
    +
    63  } addr;
    +
    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 
    +
    93 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94 
    +
    108 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109  uint16_t *port);
    +
    110 
    +
    124 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125  uint16_t *port);
    +
    126 
    +
    141 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142  uint16_t *port);
    +
    143 
    +
    158 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159  uint16_t *port);
    +
    160 
    +
    174 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175 
    +
    189 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190  size_t capacity);
    +
    191 
    +
    205 int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206  uint16_t *port);
    +
    207 
    +
    223 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224  char *utls_addr_s, size_t capacity);
    +
    225 
    +
    241 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242  char *tls_addr_s, size_t capacity);
    +
    243 
    +
    259 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260  char *tcp_addr_s, size_t capacity);
    +
    261 
    +
    277 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278  char *sctp_addr_s, size_t capacity);
    +
    279 
    +
    294 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295 
    +
    310 int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311 
    +
    327 int 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..0fd362184 --- /dev/null +++ b/doc/v1.5.0/xcm__attr_8h.html @@ -0,0 +1,614 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..3c7707208 --- /dev/null +++ b/doc/v1.5.0/xcm__attr_8h_source.html @@ -0,0 +1,139 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89  const char *value);
    +
    90 
    +
    116 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118 
    +
    135 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136  bool *value);
    +
    137 
    +
    154 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155  int64_t *value);
    +
    156 
    +
    175 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176  char *value, size_t capacity);
    +
    177 
    +
    179 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180  void *value, size_t value_len, void *cb_data);
    +
    181 
    +
    195 void 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..342cb2aed --- /dev/null +++ b/doc/v1.5.0/xcm__attr__map_8h.html @@ -0,0 +1,805 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..be21cd92c --- /dev/null +++ b/doc/v1.5.0/xcm__attr__map_8h_source.html @@ -0,0 +1,194 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name,
    +
    81  bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name,
    +
    95  int64_t attr_value);
    +
    96 
    +
    97 
    +
    107 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108  const char *attr_name,
    +
    109  const char *attr_value);
    +
    110 
    +
    111 
    +
    121 void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    122  const struct xcm_attr_map *src_map);
    +
    123 
    +
    124 
    +
    141 const 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 
    +
    161 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    162  const char *attr_name);
    +
    163 
    +
    164 
    +
    179 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    180  const char *attr_name);
    +
    181 
    +
    182 
    +
    197 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    198  const char *attr_name);
    +
    199 
    +
    208 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    209  const char *attr_name);
    +
    210 
    +
    211 
    +
    220 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    221 
    +
    222 
    +
    230 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    231 
    +
    232 
    +
    236 typedef 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 
    +
    255 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    256  xcm_attr_map_foreach_cb cb, void *user);
    +
    257 
    +
    258 
    +
    267 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    268  const struct xcm_attr_map *attr_map_b);
    +
    269 
    +
    278 void 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)
    +
    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)
    +
    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 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 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..af06497d9 --- /dev/null +++ b/doc/v1.5.0/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..aef8ddd73 --- /dev/null +++ b/doc/v1.5.0/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..172a4f1e1 --- /dev/null +++ b/doc/v1.5.0/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..41ab226ee --- /dev/null +++ b/doc/v1.5.0/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..7e9841452 --- /dev/null +++ b/doc/v1.5.0/xcm__version_8h.html @@ -0,0 +1,372 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..2ba1aa9bb --- /dev/null +++ b/doc/v1.5.0/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    47 unsigned int xcm_version_major(void);
    +
    48 
    +
    55 unsigned int xcm_version_minor(void);
    +
    56 
    +
    62 unsigned int xcm_version_patch(void);
    +
    63 
    +
    72 const char *xcm_version(void);
    +
    73 
    +
    79 unsigned int xcm_version_api_major(void);
    +
    80 
    +
    86 unsigned int xcm_version_api_minor(void);
    +
    87 
    +
    96 const char *xcm_version_api(void);
    +
    97 
    +
    98 #ifdef __cplusplus
    +
    99 }
    +
    100 #endif
    +
    101 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..a91bef52b --- /dev/null +++ b/doc/v1.5.1/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/doc/v1.5.1/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/doc/v1.5.1/bdwn.png differ diff --git a/doc/v1.5.1/classes.html b/doc/v1.5.1/classes.html new file mode 100644 index 000000000..d0e2fac5a --- /dev/null +++ b/doc/v1.5.1/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..d9c89ff23 --- /dev/null +++ b/doc/v1.5.1/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,103 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    file  xcm_version.h [code]
     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.png b/doc/v1.5.1/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/doc/v1.5.1/doc.png differ diff --git a/doc/v1.5.1/doxygen.css b/doc/v1.5.1/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/doc/v1.5.1/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doc/v1.5.1/doxygen.svg b/doc/v1.5.1/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/doc/v1.5.1/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.5.1/dynsections.js b/doc/v1.5.1/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/doc/v1.5.1/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/doc/v1.5.1/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/doc/v1.5.1/folderclosed.png differ diff --git a/doc/v1.5.1/folderopen.png b/doc/v1.5.1/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/doc/v1.5.1/folderopen.png differ diff --git a/doc/v1.5.1/functions.html b/doc/v1.5.1/functions.html new file mode 100644 index 000000000..eacd31b3f --- /dev/null +++ b/doc/v1.5.1/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..080488c9d --- /dev/null +++ b/doc/v1.5.1/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.5.1/globals.html b/doc/v1.5.1/globals.html new file mode 100644 index 000000000..de4a9c82e --- /dev/null +++ b/doc/v1.5.1/globals.html @@ -0,0 +1,356 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..5928c2517 --- /dev/null +++ b/doc/v1.5.1/globals_defs.html @@ -0,0 +1,135 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.5.1/globals_enum.html b/doc/v1.5.1/globals_enum.html new file mode 100644 index 000000000..090db43c0 --- /dev/null +++ b/doc/v1.5.1/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.5.1/globals_eval.html b/doc/v1.5.1/globals_eval.html new file mode 100644 index 000000000..2b8f2603e --- /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) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.5.1/globals_func.html b/doc/v1.5.1/globals_func.html new file mode 100644 index 000000000..5b9f50bbf --- /dev/null +++ b/doc/v1.5.1/globals_func.html @@ -0,0 +1,272 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - 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..fd9c177d5 --- /dev/null +++ b/doc/v1.5.1/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + 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..0f08b4af0 --- /dev/null +++ b/doc/v1.5.1/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.5.1/group__lib__version.html b/doc/v1.5.1/group__lib__version.html new file mode 100644 index 000000000..7f0858a9b --- /dev/null +++ b/doc/v1.5.1/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.5.1/index.html b/doc/v1.5.1/index.html new file mode 100644 index 000000000..2651c7dee --- /dev/null +++ b/doc/v1.5.1/index.html @@ -0,0 +1,621 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/doc/v1.5.1/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/doc/v1.5.1/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/doc/v1.5.1/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/doc/v1.5.1/modules.html new file mode 100644 index 000000000..75399f90c --- /dev/null +++ b/doc/v1.5.1/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/doc/v1.5.1/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..e1c7e12e8 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/doc/v1.5.1/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/doc/v1.5.1/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..7130f6379 --- /dev/null +++ b/doc/v1.5.1/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.5.1/search/all_1.html b/doc/v1.5.1/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/doc/v1.5.1/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..69f82ad46 --- /dev/null +++ b/doc/v1.5.1/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.5.1/search/all_2.html b/doc/v1.5.1/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/doc/v1.5.1/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ae6e4d753 --- /dev/null +++ b/doc/v1.5.1/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.5.1/search/all_3.html b/doc/v1.5.1/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/doc/v1.5.1/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..551054f77 --- /dev/null +++ b/doc/v1.5.1/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.5.1/search/all_4.html b/doc/v1.5.1/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/doc/v1.5.1/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..fd3d5a006 --- /dev/null +++ b/doc/v1.5.1/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.5.1/search/all_5.html b/doc/v1.5.1/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/doc/v1.5.1/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5273f9abc --- /dev/null +++ b/doc/v1.5.1/search/all_5.js @@ -0,0 +1,106 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_8',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_9',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_10',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_11',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_12',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_13',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_14',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_15',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_16',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_17',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_18',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_19',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_20',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_21',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_22',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_23',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_24',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_25',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_26',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_27',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_28',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_29',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_30',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',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_5fint64_32',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_33',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_34',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['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_5fbool_37',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_38',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_39',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_40',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_41',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_42',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_43',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_44',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_45',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_46',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_47',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_48',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_49',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_50',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_51',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_52',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_53',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_54',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_55',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_56',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_57',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_58',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_59',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_60',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_61',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_62',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_63',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_64',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_65',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_66',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_67',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_68',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_69',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_70',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_71',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_72',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_73',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_74',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_75',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_76',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_77',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_78',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_79',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_80',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_81',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_82',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_83',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_84',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_85',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_86',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_87',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_88',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_89',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_90',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_91',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_92',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_93',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_94',['XCM_VERSION',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_95',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_96',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_97',['XCM_VERSION_API',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_98',['XCM_VERSION_API_MAJOR',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_99',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_100',['XCM_VERSION_API_MINOR',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_101',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_102',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_103',['XCM_VERSION_MAJOR',['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_104',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_105',['XCM_VERSION_MINOR',['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_106',['XCM_VERSION_PATCH',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_107',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_108',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.5.1/search/all_6.html b/doc/v1.5.1/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/doc/v1.5.1/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5debab10e --- /dev/null +++ b/doc/v1.5.1/search/all_6.js @@ -0,0 +1,119 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_14',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_15',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_16',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_17',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_18',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_19',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_20',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_21',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_22',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_23',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_24',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_25',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_26',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_27',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_28',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_29',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_30',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_31',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_32',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_33',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_34',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_35',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_36',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_37',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_38',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_39',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_40',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_41',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_51',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_59',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_60',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_61',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_62',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_63',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_84',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',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#a4d8d62a9625b49993b7d6ec03de8e765',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#ad52a0d86b7b5bf802835758cc9251e2e',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#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_98',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',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',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_109',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_110',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_111',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_112',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_113',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_114',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_115',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_116',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_117',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_118',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_119',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_120',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_121',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_122',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_123',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.5.1/search/classes_0.html b/doc/v1.5.1/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/doc/v1.5.1/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..a2e56ee61 --- /dev/null +++ b/doc/v1.5.1/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_109',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_110',['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..a933eea1a --- /dev/null +++ b/doc/v1.5.1/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/doc/v1.5.1/search/defines_0.html b/doc/v1.5.1/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/doc/v1.5.1/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..e8b050945 --- /dev/null +++ b/doc/v1.5.1/search/defines_0.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_196',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_197',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_198',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_199',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_200',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_201',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_202',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_203',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_204',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_205',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_206',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_207',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_208',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_209',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_210',['XCM_VERSION',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_211',['XCM_VERSION_API',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_212',['XCM_VERSION_API_MAJOR',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_213',['XCM_VERSION_API_MINOR',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_214',['XCM_VERSION_MAJOR',['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_215',['XCM_VERSION_MINOR',['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_216',['XCM_VERSION_PATCH',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]] +]; diff --git a/doc/v1.5.1/search/enums_0.html b/doc/v1.5.1/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/doc/v1.5.1/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..14e43419a --- /dev/null +++ b/doc/v1.5.1/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_191',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.5.1/search/enumvalues_0.html b/doc/v1.5.1/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/doc/v1.5.1/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..47eaf0ba8 --- /dev/null +++ b/doc/v1.5.1/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_192',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_193',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_194',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_195',['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.html b/doc/v1.5.1/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/doc/v1.5.1/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..49cc3f564 --- /dev/null +++ b/doc/v1.5.1/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_111',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_112',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_113',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_114',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_115',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_116',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_117',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/doc/v1.5.1/search/functions_0.html b/doc/v1.5.1/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/doc/v1.5.1/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..0df50007a --- /dev/null +++ b/doc/v1.5.1/search/functions_0.js @@ -0,0 +1,69 @@ +var searchData= +[ + ['xcm_5faccept_118',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_119',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_120',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_121',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_122',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_123',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_124',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_125',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_126',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_127',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_128',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_129',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_130',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_131',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_132',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_133',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_134',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_135',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_136',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_137',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_138',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_139',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_140',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_141',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_142',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_143',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_144',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_145',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_146',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_147',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_148',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_149',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_150',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_151',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_152',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_153',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_154',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_155',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_156',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_157',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_158',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_159',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_160',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_161',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_162',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_163',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_164',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_165',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_166',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_167',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_168',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_169',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_170',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_171',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_172',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_173',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_174',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_175',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_176',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_177',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_178',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_179',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_180',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_181',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_182',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_183',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.5.1/search/groups_0.html b/doc/v1.5.1/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/doc/v1.5.1/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ee66bd8d9 --- /dev/null +++ b/doc/v1.5.1/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_238',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.5.1/search/groups_1.html b/doc/v1.5.1/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/doc/v1.5.1/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..73d61cda3 --- /dev/null +++ b/doc/v1.5.1/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_239',['Library Version',['../group__lib__version.html',1,'']]] +]; 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..03626f64a --- /dev/null +++ b/doc/v1.5.1/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/doc/v1.5.1/search/nomatches.html b/doc/v1.5.1/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/doc/v1.5.1/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/doc/v1.5.1/search/pages_0.html b/doc/v1.5.1/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/doc/v1.5.1/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5b432bae5 --- /dev/null +++ b/doc/v1.5.1/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_217',['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..9074198f8 --- /dev/null +++ b/doc/v1.5.1/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/doc/v1.5.1/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.5.1/search/typedefs_0.js b/doc/v1.5.1/search/typedefs_0.js new file mode 100644 index 000000000..9c9abbd1f --- /dev/null +++ b/doc/v1.5.1/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_189',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_190',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/doc/v1.5.1/search/variables_0.html b/doc/v1.5.1/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/doc/v1.5.1/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.5.1/search/variables_0.js b/doc/v1.5.1/search/variables_0.js new file mode 100644 index 000000000..3205b1959 --- /dev/null +++ b/doc/v1.5.1/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_184',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.5.1/search/variables_1.html b/doc/v1.5.1/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/doc/v1.5.1/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.5.1/search/variables_1.js b/doc/v1.5.1/search/variables_1.js new file mode 100644 index 000000000..b2effea2c --- /dev/null +++ b/doc/v1.5.1/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_185',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.5.1/search/variables_2.html b/doc/v1.5.1/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/doc/v1.5.1/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.5.1/search/variables_2.js b/doc/v1.5.1/search/variables_2.js new file mode 100644 index 000000000..5cda77d5d --- /dev/null +++ b/doc/v1.5.1/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_186',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_187',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.5.1/search/variables_3.html b/doc/v1.5.1/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/doc/v1.5.1/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.5.1/search/variables_3.js b/doc/v1.5.1/search/variables_3.js new file mode 100644 index 000000000..df0550499 --- /dev/null +++ b/doc/v1.5.1/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_188',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.5.1/server_accept.png b/doc/v1.5.1/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/doc/v1.5.1/server_accept.png differ diff --git a/doc/v1.5.1/splitbar.png b/doc/v1.5.1/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/doc/v1.5.1/splitbar.png differ diff --git a/doc/v1.5.1/structxcm__addr__host.html b/doc/v1.5.1/structxcm__addr__host.html new file mode 100644 index 000000000..caf66d118 --- /dev/null +++ b/doc/v1.5.1/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..21dc17e3c --- /dev/null +++ b/doc/v1.5.1/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/doc/v1.5.1/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/doc/v1.5.1/xcm_8h.html b/doc/v1.5.1/xcm_8h.html new file mode 100644 index 000000000..13ecf4b63 --- /dev/null +++ b/doc/v1.5.1/xcm_8h.html @@ -0,0 +1,908 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..e5eac5734 --- /dev/null +++ b/doc/v1.5.1/xcm_8h_source.html @@ -0,0 +1,164 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1254 struct xcm_socket;
    +
    1255 
    +
    1308 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1309 
    +
    1331 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1332  const struct xcm_attr_map *attrs);
    +
    1333 
    +
    1369 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1370 
    +
    1386 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1387  const struct xcm_attr_map *attrs);
    +
    1388 
    +
    1405 int xcm_close(struct xcm_socket *socket);
    +
    1406 
    +
    1426 void xcm_cleanup(struct xcm_socket *socket);
    +
    1427 
    +
    1446 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1447 
    +
    1467 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1468  const struct xcm_attr_map *attrs);
    +
    1469 
    +
    1492 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1493 
    +
    1517 int 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 
    +
    1588 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1589 
    +
    1631 int xcm_fd(struct xcm_socket *socket);
    +
    1632 
    +
    1677 int xcm_finish(struct xcm_socket *socket);
    +
    1678 
    +
    1719 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1720 
    +
    1735 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1736 
    +
    1753 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1754 
    +
    1769 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..b53aa9f37 --- /dev/null +++ b/doc/v1.5.1/xcm__addr_8h.html @@ -0,0 +1,1070 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..4e9e05f02 --- /dev/null +++ b/doc/v1.5.1/xcm__addr_8h_source.html @@ -0,0 +1,199 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    44 enum 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];
    +
    63  } addr;
    +
    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 
    +
    93 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94 
    +
    108 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109  uint16_t *port);
    +
    110 
    +
    124 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125  uint16_t *port);
    +
    126 
    +
    141 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142  uint16_t *port);
    +
    143 
    +
    158 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159  uint16_t *port);
    +
    160 
    +
    174 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175 
    +
    189 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190  size_t capacity);
    +
    191 
    +
    205 int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206  uint16_t *port);
    +
    207 
    +
    223 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224  char *utls_addr_s, size_t capacity);
    +
    225 
    +
    241 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242  char *tls_addr_s, size_t capacity);
    +
    243 
    +
    259 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260  char *tcp_addr_s, size_t capacity);
    +
    261 
    +
    277 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278  char *sctp_addr_s, size_t capacity);
    +
    279 
    +
    294 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295 
    +
    310 int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311 
    +
    327 int 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..99a768cf5 --- /dev/null +++ b/doc/v1.5.1/xcm__attr_8h.html @@ -0,0 +1,614 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..124a70b42 --- /dev/null +++ b/doc/v1.5.1/xcm__attr_8h_source.html @@ -0,0 +1,139 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89  const char *value);
    +
    90 
    +
    116 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118 
    +
    135 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136  bool *value);
    +
    137 
    +
    154 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155  int64_t *value);
    +
    156 
    +
    175 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176  char *value, size_t capacity);
    +
    177 
    +
    179 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180  void *value, size_t value_len, void *cb_data);
    +
    181 
    +
    195 void 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..1ced93d40 --- /dev/null +++ b/doc/v1.5.1/xcm__attr__map_8h.html @@ -0,0 +1,805 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..48072e7e0 --- /dev/null +++ b/doc/v1.5.1/xcm__attr__map_8h_source.html @@ -0,0 +1,194 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name,
    +
    81  bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name,
    +
    95  int64_t attr_value);
    +
    96 
    +
    97 
    +
    107 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108  const char *attr_name,
    +
    109  const char *attr_value);
    +
    110 
    +
    111 
    +
    121 void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    122  const struct xcm_attr_map *src_map);
    +
    123 
    +
    124 
    +
    141 const 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 
    +
    161 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    162  const char *attr_name);
    +
    163 
    +
    164 
    +
    179 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    180  const char *attr_name);
    +
    181 
    +
    182 
    +
    197 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    198  const char *attr_name);
    +
    199 
    +
    208 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    209  const char *attr_name);
    +
    210 
    +
    211 
    +
    220 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    221 
    +
    222 
    +
    230 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    231 
    +
    232 
    +
    236 typedef 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 
    +
    255 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    256  xcm_attr_map_foreach_cb cb, void *user);
    +
    257 
    +
    258 
    +
    267 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    268  const struct xcm_attr_map *attr_map_b);
    +
    269 
    +
    278 void 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)
    +
    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)
    +
    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 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 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..edec5353a --- /dev/null +++ b/doc/v1.5.1/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..50511bbd0 --- /dev/null +++ b/doc/v1.5.1/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..e44265fd5 --- /dev/null +++ b/doc/v1.5.1/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..125c0e458 --- /dev/null +++ b/doc/v1.5.1/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..3f97e7253 --- /dev/null +++ b/doc/v1.5.1/xcm__version_8h.html @@ -0,0 +1,372 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..5c983322b --- /dev/null +++ b/doc/v1.5.1/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    47 unsigned int xcm_version_major(void);
    +
    48 
    +
    55 unsigned int xcm_version_minor(void);
    +
    56 
    +
    62 unsigned int xcm_version_patch(void);
    +
    63 
    +
    72 const char *xcm_version(void);
    +
    73 
    +
    79 unsigned int xcm_version_api_major(void);
    +
    80 
    +
    86 unsigned int xcm_version_api_minor(void);
    +
    87 
    +
    96 const char *xcm_version_api(void);
    +
    97 
    +
    98 #ifdef __cplusplus
    +
    99 }
    +
    100 #endif
    +
    101 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..e90604e55 --- /dev/null +++ b/doc/v1.6.0/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/doc/v1.6.0/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/doc/v1.6.0/bdwn.png differ diff --git a/doc/v1.6.0/classes.html b/doc/v1.6.0/classes.html new file mode 100644 index 000000000..b060f9121 --- /dev/null +++ b/doc/v1.6.0/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..16522d511 --- /dev/null +++ b/doc/v1.6.0/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,103 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    file  xcm_version.h [code]
     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.png b/doc/v1.6.0/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/doc/v1.6.0/doc.png differ diff --git a/doc/v1.6.0/doxygen.css b/doc/v1.6.0/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/doc/v1.6.0/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doc/v1.6.0/doxygen.svg b/doc/v1.6.0/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/doc/v1.6.0/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.6.0/dynsections.js b/doc/v1.6.0/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/doc/v1.6.0/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/doc/v1.6.0/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/doc/v1.6.0/folderclosed.png differ diff --git a/doc/v1.6.0/folderopen.png b/doc/v1.6.0/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/doc/v1.6.0/folderopen.png differ diff --git a/doc/v1.6.0/functions.html b/doc/v1.6.0/functions.html new file mode 100644 index 000000000..2abbf37bb --- /dev/null +++ b/doc/v1.6.0/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..4803f61a5 --- /dev/null +++ b/doc/v1.6.0/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.6.0/globals.html b/doc/v1.6.0/globals.html new file mode 100644 index 000000000..b1c6b6755 --- /dev/null +++ b/doc/v1.6.0/globals.html @@ -0,0 +1,356 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..3ecc94214 --- /dev/null +++ b/doc/v1.6.0/globals_defs.html @@ -0,0 +1,135 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.6.0/globals_enum.html b/doc/v1.6.0/globals_enum.html new file mode 100644 index 000000000..e33633f29 --- /dev/null +++ b/doc/v1.6.0/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.6.0/globals_eval.html b/doc/v1.6.0/globals_eval.html new file mode 100644 index 000000000..73d100f92 --- /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) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.6.0/globals_func.html b/doc/v1.6.0/globals_func.html new file mode 100644 index 000000000..4a936dddb --- /dev/null +++ b/doc/v1.6.0/globals_func.html @@ -0,0 +1,272 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - 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..ffefedd68 --- /dev/null +++ b/doc/v1.6.0/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + 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..0f08b4af0 --- /dev/null +++ b/doc/v1.6.0/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.6.0/group__lib__version.html b/doc/v1.6.0/group__lib__version.html new file mode 100644 index 000000000..7f0858a9b --- /dev/null +++ b/doc/v1.6.0/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.6.0/index.html b/doc/v1.6.0/index.html new file mode 100644 index 000000000..7d052bd7d --- /dev/null +++ b/doc/v1.6.0/index.html @@ -0,0 +1,629 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/doc/v1.6.0/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/doc/v1.6.0/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/doc/v1.6.0/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/doc/v1.6.0/modules.html new file mode 100644 index 000000000..75399f90c --- /dev/null +++ b/doc/v1.6.0/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/doc/v1.6.0/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..e1c7e12e8 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/doc/v1.6.0/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/doc/v1.6.0/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..7130f6379 --- /dev/null +++ b/doc/v1.6.0/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.6.0/search/all_1.html b/doc/v1.6.0/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/doc/v1.6.0/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..69f82ad46 --- /dev/null +++ b/doc/v1.6.0/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.6.0/search/all_2.html b/doc/v1.6.0/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/doc/v1.6.0/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ae6e4d753 --- /dev/null +++ b/doc/v1.6.0/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.6.0/search/all_3.html b/doc/v1.6.0/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/doc/v1.6.0/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..551054f77 --- /dev/null +++ b/doc/v1.6.0/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.6.0/search/all_4.html b/doc/v1.6.0/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/doc/v1.6.0/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..fd3d5a006 --- /dev/null +++ b/doc/v1.6.0/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.6.0/search/all_5.html b/doc/v1.6.0/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/doc/v1.6.0/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5273f9abc --- /dev/null +++ b/doc/v1.6.0/search/all_5.js @@ -0,0 +1,106 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_8',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_9',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_10',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_11',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_12',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_13',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_14',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_15',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_16',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_17',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_18',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_19',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_20',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_21',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_22',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_23',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_24',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_25',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_26',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_27',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_28',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_29',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_30',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',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_5fint64_32',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_33',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_34',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['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_5fbool_37',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_38',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_39',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_40',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_41',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_42',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_43',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_44',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_45',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_46',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_47',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_48',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_49',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_50',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_51',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_52',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_53',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_54',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_55',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_56',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_57',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_58',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_59',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_60',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_61',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_62',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_63',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_64',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_65',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_66',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_67',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_68',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_69',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_70',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_71',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_72',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_73',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_74',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_75',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_76',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_77',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_78',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_79',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_80',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_81',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_82',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_83',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_84',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_85',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_86',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_87',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_88',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_89',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_90',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_91',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_92',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_93',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_94',['XCM_VERSION',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_95',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_96',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_97',['XCM_VERSION_API',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_98',['XCM_VERSION_API_MAJOR',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_99',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_100',['XCM_VERSION_API_MINOR',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_101',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_102',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_103',['XCM_VERSION_MAJOR',['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_104',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_105',['XCM_VERSION_MINOR',['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_106',['XCM_VERSION_PATCH',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_107',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_108',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.6.0/search/all_6.html b/doc/v1.6.0/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/doc/v1.6.0/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5debab10e --- /dev/null +++ b/doc/v1.6.0/search/all_6.js @@ -0,0 +1,119 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_14',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_15',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_16',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_17',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_18',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_19',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_20',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_21',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_22',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_23',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_24',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_25',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_26',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_27',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_28',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_29',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_30',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_31',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_32',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_33',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_34',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_35',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_36',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_37',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_38',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_39',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_40',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_41',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_51',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_59',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_60',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_61',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_62',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_63',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_84',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',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#a4d8d62a9625b49993b7d6ec03de8e765',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#ad52a0d86b7b5bf802835758cc9251e2e',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#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_98',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',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',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_109',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_110',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_111',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_112',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_113',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_114',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_115',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_116',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_117',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_118',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_119',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_120',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_121',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_122',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_123',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.6.0/search/classes_0.html b/doc/v1.6.0/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/doc/v1.6.0/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..a2e56ee61 --- /dev/null +++ b/doc/v1.6.0/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_109',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_110',['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..a933eea1a --- /dev/null +++ b/doc/v1.6.0/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/doc/v1.6.0/search/defines_0.html b/doc/v1.6.0/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/doc/v1.6.0/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..e8b050945 --- /dev/null +++ b/doc/v1.6.0/search/defines_0.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_196',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_197',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_198',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_199',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_200',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_201',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_202',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_203',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_204',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_205',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_206',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_207',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_208',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_209',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_210',['XCM_VERSION',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_211',['XCM_VERSION_API',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_212',['XCM_VERSION_API_MAJOR',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_213',['XCM_VERSION_API_MINOR',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_214',['XCM_VERSION_MAJOR',['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_215',['XCM_VERSION_MINOR',['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_216',['XCM_VERSION_PATCH',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]] +]; diff --git a/doc/v1.6.0/search/enums_0.html b/doc/v1.6.0/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/doc/v1.6.0/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..14e43419a --- /dev/null +++ b/doc/v1.6.0/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_191',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.6.0/search/enumvalues_0.html b/doc/v1.6.0/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/doc/v1.6.0/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..47eaf0ba8 --- /dev/null +++ b/doc/v1.6.0/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_192',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_193',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_194',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_195',['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.html b/doc/v1.6.0/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/doc/v1.6.0/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..49cc3f564 --- /dev/null +++ b/doc/v1.6.0/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_111',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_112',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_113',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_114',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_115',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_116',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_117',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/doc/v1.6.0/search/functions_0.html b/doc/v1.6.0/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/doc/v1.6.0/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..0df50007a --- /dev/null +++ b/doc/v1.6.0/search/functions_0.js @@ -0,0 +1,69 @@ +var searchData= +[ + ['xcm_5faccept_118',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_119',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_120',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_121',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_122',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_123',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_124',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_125',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_126',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_127',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_128',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_129',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_130',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_131',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_132',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_133',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_134',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_135',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_136',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_137',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_138',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_139',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_140',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_141',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_142',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_143',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_144',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_145',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_146',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_147',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_148',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_149',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_150',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_151',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_152',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_153',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_154',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_155',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_156',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_157',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_158',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_159',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_160',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_161',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_162',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_163',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_164',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_165',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_166',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_167',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_168',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_169',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_170',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_171',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_172',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_173',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_174',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_175',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_176',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_177',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_178',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_179',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_180',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_181',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_182',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_183',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.6.0/search/groups_0.html b/doc/v1.6.0/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/doc/v1.6.0/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ee66bd8d9 --- /dev/null +++ b/doc/v1.6.0/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_238',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.6.0/search/groups_1.html b/doc/v1.6.0/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/doc/v1.6.0/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..73d61cda3 --- /dev/null +++ b/doc/v1.6.0/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_239',['Library Version',['../group__lib__version.html',1,'']]] +]; 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..03626f64a --- /dev/null +++ b/doc/v1.6.0/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/doc/v1.6.0/search/nomatches.html b/doc/v1.6.0/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/doc/v1.6.0/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/doc/v1.6.0/search/pages_0.html b/doc/v1.6.0/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/doc/v1.6.0/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5b432bae5 --- /dev/null +++ b/doc/v1.6.0/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_217',['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..9074198f8 --- /dev/null +++ b/doc/v1.6.0/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/doc/v1.6.0/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.6.0/search/typedefs_0.js b/doc/v1.6.0/search/typedefs_0.js new file mode 100644 index 000000000..9c9abbd1f --- /dev/null +++ b/doc/v1.6.0/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_189',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_190',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/doc/v1.6.0/search/variables_0.html b/doc/v1.6.0/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/doc/v1.6.0/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.6.0/search/variables_0.js b/doc/v1.6.0/search/variables_0.js new file mode 100644 index 000000000..3205b1959 --- /dev/null +++ b/doc/v1.6.0/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_184',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.6.0/search/variables_1.html b/doc/v1.6.0/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/doc/v1.6.0/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.6.0/search/variables_1.js b/doc/v1.6.0/search/variables_1.js new file mode 100644 index 000000000..b2effea2c --- /dev/null +++ b/doc/v1.6.0/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_185',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.6.0/search/variables_2.html b/doc/v1.6.0/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/doc/v1.6.0/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.6.0/search/variables_2.js b/doc/v1.6.0/search/variables_2.js new file mode 100644 index 000000000..5cda77d5d --- /dev/null +++ b/doc/v1.6.0/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_186',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_187',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.6.0/search/variables_3.html b/doc/v1.6.0/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/doc/v1.6.0/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.6.0/search/variables_3.js b/doc/v1.6.0/search/variables_3.js new file mode 100644 index 000000000..df0550499 --- /dev/null +++ b/doc/v1.6.0/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_188',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.6.0/server_accept.png b/doc/v1.6.0/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/doc/v1.6.0/server_accept.png differ diff --git a/doc/v1.6.0/splitbar.png b/doc/v1.6.0/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/doc/v1.6.0/splitbar.png differ diff --git a/doc/v1.6.0/structxcm__addr__host.html b/doc/v1.6.0/structxcm__addr__host.html new file mode 100644 index 000000000..52d3ec016 --- /dev/null +++ b/doc/v1.6.0/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..9ffe303a0 --- /dev/null +++ b/doc/v1.6.0/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/doc/v1.6.0/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/doc/v1.6.0/xcm_8h.html b/doc/v1.6.0/xcm_8h.html new file mode 100644 index 000000000..303c21dd9 --- /dev/null +++ b/doc/v1.6.0/xcm_8h.html @@ -0,0 +1,909 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..67683b288 --- /dev/null +++ b/doc/v1.6.0/xcm_8h_source.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1276 struct xcm_socket;
    +
    1277 
    +
    1330 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1331 
    +
    1353 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1354  const struct xcm_attr_map *attrs);
    +
    1355 
    +
    1391 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1392 
    +
    1408 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1409  const struct xcm_attr_map *attrs);
    +
    1410 
    +
    1427 int xcm_close(struct xcm_socket *socket);
    +
    1428 
    +
    1448 void xcm_cleanup(struct xcm_socket *socket);
    +
    1449 
    +
    1468 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1469 
    +
    1489 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1490  const struct xcm_attr_map *attrs);
    +
    1491 
    +
    1514 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1515 
    +
    1539 int 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 
    +
    1610 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1611 
    +
    1653 int xcm_fd(struct xcm_socket *socket);
    +
    1654 
    +
    1699 int xcm_finish(struct xcm_socket *socket);
    +
    1700 
    +
    1741 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1742 
    +
    1757 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1758 
    +
    1775 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1776 
    +
    1791 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..7b40a2edd --- /dev/null +++ b/doc/v1.6.0/xcm__addr_8h.html @@ -0,0 +1,1070 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..fb3e94d74 --- /dev/null +++ b/doc/v1.6.0/xcm__addr_8h_source.html @@ -0,0 +1,199 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    44 enum 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];
    +
    63  } addr;
    +
    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 
    +
    93 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94 
    +
    108 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109  uint16_t *port);
    +
    110 
    +
    124 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125  uint16_t *port);
    +
    126 
    +
    141 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142  uint16_t *port);
    +
    143 
    +
    158 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159  uint16_t *port);
    +
    160 
    +
    174 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175 
    +
    189 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190  size_t capacity);
    +
    191 
    +
    205 int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206  uint16_t *port);
    +
    207 
    +
    223 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224  char *utls_addr_s, size_t capacity);
    +
    225 
    +
    241 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242  char *tls_addr_s, size_t capacity);
    +
    243 
    +
    259 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260  char *tcp_addr_s, size_t capacity);
    +
    261 
    +
    277 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278  char *sctp_addr_s, size_t capacity);
    +
    279 
    +
    294 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295 
    +
    310 int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311 
    +
    327 int 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..bf63bac7f --- /dev/null +++ b/doc/v1.6.0/xcm__attr_8h.html @@ -0,0 +1,614 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..e30b64f3f --- /dev/null +++ b/doc/v1.6.0/xcm__attr_8h_source.html @@ -0,0 +1,139 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89  const char *value);
    +
    90 
    +
    116 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118 
    +
    135 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136  bool *value);
    +
    137 
    +
    154 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155  int64_t *value);
    +
    156 
    +
    175 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176  char *value, size_t capacity);
    +
    177 
    +
    179 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180  void *value, size_t value_len, void *cb_data);
    +
    181 
    +
    195 void 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..313cfa8cc --- /dev/null +++ b/doc/v1.6.0/xcm__attr__map_8h.html @@ -0,0 +1,805 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..441052119 --- /dev/null +++ b/doc/v1.6.0/xcm__attr__map_8h_source.html @@ -0,0 +1,194 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    22 #include <xcm_attr_types.h>
    +
    23 
    +
    24 #include <stdbool.h>
    +
    25 #include <stddef.h>
    +
    26 #include <stdint.h>
    +
    27 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name,
    +
    81  bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name,
    +
    95  int64_t attr_value);
    +
    96 
    +
    97 
    +
    107 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108  const char *attr_name,
    +
    109  const char *attr_value);
    +
    110 
    +
    111 
    +
    121 void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    122  const struct xcm_attr_map *src_map);
    +
    123 
    +
    124 
    +
    141 const 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 
    +
    161 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    162  const char *attr_name);
    +
    163 
    +
    164 
    +
    179 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    180  const char *attr_name);
    +
    181 
    +
    182 
    +
    197 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    198  const char *attr_name);
    +
    199 
    +
    208 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    209  const char *attr_name);
    +
    210 
    +
    211 
    +
    220 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    221 
    +
    222 
    +
    230 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    231 
    +
    232 
    +
    236 typedef 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 
    +
    255 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    256  xcm_attr_map_foreach_cb cb, void *user);
    +
    257 
    +
    258 
    +
    267 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    268  const struct xcm_attr_map *attr_map_b);
    +
    269 
    +
    278 void 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)
    +
    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)
    +
    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 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 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..ceffde76d --- /dev/null +++ b/doc/v1.6.0/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..9f7284ef9 --- /dev/null +++ b/doc/v1.6.0/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..3c0dbb06d --- /dev/null +++ b/doc/v1.6.0/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..b52a3fb92 --- /dev/null +++ b/doc/v1.6.0/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..dd7f72e3f --- /dev/null +++ b/doc/v1.6.0/xcm__version_8h.html @@ -0,0 +1,372 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..010f86b41 --- /dev/null +++ b/doc/v1.6.0/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    47 unsigned int xcm_version_major(void);
    +
    48 
    +
    55 unsigned int xcm_version_minor(void);
    +
    56 
    +
    62 unsigned int xcm_version_patch(void);
    +
    63 
    +
    72 const char *xcm_version(void);
    +
    73 
    +
    79 unsigned int xcm_version_api_major(void);
    +
    80 
    +
    86 unsigned int xcm_version_api_minor(void);
    +
    87 
    +
    96 const char *xcm_version_api(void);
    +
    97 
    +
    98 #ifdef __cplusplus
    +
    99 }
    +
    100 #endif
    +
    101 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..ff4ef5e7d --- /dev/null +++ b/doc/v1.6.1/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/doc/v1.6.1/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/doc/v1.6.1/bdwn.png differ diff --git a/doc/v1.6.1/classes.html b/doc/v1.6.1/classes.html new file mode 100644 index 000000000..234557af4 --- /dev/null +++ b/doc/v1.6.1/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..1d28b398b --- /dev/null +++ b/doc/v1.6.1/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,103 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    file  xcm_version.h [code]
     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.png b/doc/v1.6.1/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/doc/v1.6.1/doc.png differ diff --git a/doc/v1.6.1/doxygen.css b/doc/v1.6.1/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/doc/v1.6.1/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doc/v1.6.1/doxygen.svg b/doc/v1.6.1/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/doc/v1.6.1/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.6.1/dynsections.js b/doc/v1.6.1/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/doc/v1.6.1/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/doc/v1.6.1/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/doc/v1.6.1/folderclosed.png differ diff --git a/doc/v1.6.1/folderopen.png b/doc/v1.6.1/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/doc/v1.6.1/folderopen.png differ diff --git a/doc/v1.6.1/functions.html b/doc/v1.6.1/functions.html new file mode 100644 index 000000000..de7b0ab22 --- /dev/null +++ b/doc/v1.6.1/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..afba879d5 --- /dev/null +++ b/doc/v1.6.1/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.6.1/globals.html b/doc/v1.6.1/globals.html new file mode 100644 index 000000000..ae6f51fd7 --- /dev/null +++ b/doc/v1.6.1/globals.html @@ -0,0 +1,356 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..3822fc8c7 --- /dev/null +++ b/doc/v1.6.1/globals_defs.html @@ -0,0 +1,135 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.6.1/globals_enum.html b/doc/v1.6.1/globals_enum.html new file mode 100644 index 000000000..183839895 --- /dev/null +++ b/doc/v1.6.1/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.6.1/globals_eval.html b/doc/v1.6.1/globals_eval.html new file mode 100644 index 000000000..5903d768f --- /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) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.6.1/globals_func.html b/doc/v1.6.1/globals_func.html new file mode 100644 index 000000000..c72768595 --- /dev/null +++ b/doc/v1.6.1/globals_func.html @@ -0,0 +1,272 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - 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..fbdafd8c2 --- /dev/null +++ b/doc/v1.6.1/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + 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..0f08b4af0 --- /dev/null +++ b/doc/v1.6.1/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.6.1/group__lib__version.html b/doc/v1.6.1/group__lib__version.html new file mode 100644 index 000000000..7f0858a9b --- /dev/null +++ b/doc/v1.6.1/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.6.1/index.html b/doc/v1.6.1/index.html new file mode 100644 index 000000000..495087bc6 --- /dev/null +++ b/doc/v1.6.1/index.html @@ -0,0 +1,629 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/doc/v1.6.1/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/doc/v1.6.1/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/doc/v1.6.1/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/doc/v1.6.1/modules.html new file mode 100644 index 000000000..75399f90c --- /dev/null +++ b/doc/v1.6.1/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/doc/v1.6.1/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..e1c7e12e8 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/doc/v1.6.1/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/doc/v1.6.1/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..7130f6379 --- /dev/null +++ b/doc/v1.6.1/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.6.1/search/all_1.html b/doc/v1.6.1/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/doc/v1.6.1/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..69f82ad46 --- /dev/null +++ b/doc/v1.6.1/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.6.1/search/all_2.html b/doc/v1.6.1/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/doc/v1.6.1/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ae6e4d753 --- /dev/null +++ b/doc/v1.6.1/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.6.1/search/all_3.html b/doc/v1.6.1/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/doc/v1.6.1/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..551054f77 --- /dev/null +++ b/doc/v1.6.1/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.6.1/search/all_4.html b/doc/v1.6.1/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/doc/v1.6.1/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..fd3d5a006 --- /dev/null +++ b/doc/v1.6.1/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.6.1/search/all_5.html b/doc/v1.6.1/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/doc/v1.6.1/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5273f9abc --- /dev/null +++ b/doc/v1.6.1/search/all_5.js @@ -0,0 +1,106 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_8',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_9',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_10',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_11',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_12',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_13',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_14',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_15',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_16',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_17',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_18',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_19',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_20',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_21',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_22',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_23',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_24',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_25',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_26',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_27',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_28',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_29',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_30',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',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_5fint64_32',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_33',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_34',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['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_5fbool_37',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_38',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_39',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_40',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_41',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_42',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_43',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_44',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_45',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_46',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_47',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_48',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_49',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_50',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_51',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_52',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_53',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_54',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_55',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_56',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_57',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_58',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_59',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_60',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_61',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_62',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_63',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_64',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_65',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_66',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_67',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_68',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_69',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_70',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_71',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_72',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_73',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_74',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_75',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_76',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_77',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_78',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_79',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_80',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_81',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_82',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_83',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_84',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_85',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_86',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_87',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_88',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_89',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_90',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_91',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_92',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_93',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_94',['XCM_VERSION',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_95',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_96',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_97',['XCM_VERSION_API',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_98',['XCM_VERSION_API_MAJOR',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_99',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_100',['XCM_VERSION_API_MINOR',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_101',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_102',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_103',['XCM_VERSION_MAJOR',['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_104',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_105',['XCM_VERSION_MINOR',['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_106',['XCM_VERSION_PATCH',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_107',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_108',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.6.1/search/all_6.html b/doc/v1.6.1/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/doc/v1.6.1/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5debab10e --- /dev/null +++ b/doc/v1.6.1/search/all_6.js @@ -0,0 +1,119 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_14',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_15',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_16',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_17',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_18',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_19',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_20',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_21',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_22',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_23',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_24',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_25',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_26',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_27',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_28',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_29',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_30',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_31',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_32',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_33',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_34',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_35',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_36',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_37',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_38',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_39',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_40',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_41',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_51',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_59',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_60',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_61',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_62',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_63',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_84',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',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#a4d8d62a9625b49993b7d6ec03de8e765',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#ad52a0d86b7b5bf802835758cc9251e2e',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#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_98',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',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',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_109',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_110',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_111',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_112',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_113',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_114',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_115',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_116',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_117',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_118',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_119',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_120',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_121',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_122',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_123',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.6.1/search/classes_0.html b/doc/v1.6.1/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/doc/v1.6.1/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..a2e56ee61 --- /dev/null +++ b/doc/v1.6.1/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_109',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_110',['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..a933eea1a --- /dev/null +++ b/doc/v1.6.1/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/doc/v1.6.1/search/defines_0.html b/doc/v1.6.1/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/doc/v1.6.1/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..e8b050945 --- /dev/null +++ b/doc/v1.6.1/search/defines_0.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_196',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_197',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_198',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_199',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_200',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_201',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_202',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_203',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_204',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_205',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_206',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_207',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_208',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_209',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_210',['XCM_VERSION',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_211',['XCM_VERSION_API',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_212',['XCM_VERSION_API_MAJOR',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_213',['XCM_VERSION_API_MINOR',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_214',['XCM_VERSION_MAJOR',['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_215',['XCM_VERSION_MINOR',['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_216',['XCM_VERSION_PATCH',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]] +]; diff --git a/doc/v1.6.1/search/enums_0.html b/doc/v1.6.1/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/doc/v1.6.1/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..14e43419a --- /dev/null +++ b/doc/v1.6.1/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_191',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.6.1/search/enumvalues_0.html b/doc/v1.6.1/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/doc/v1.6.1/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..47eaf0ba8 --- /dev/null +++ b/doc/v1.6.1/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_192',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_193',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_194',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_195',['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.html b/doc/v1.6.1/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/doc/v1.6.1/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..49cc3f564 --- /dev/null +++ b/doc/v1.6.1/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_111',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_112',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_113',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_114',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_115',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_116',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_117',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/doc/v1.6.1/search/functions_0.html b/doc/v1.6.1/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/doc/v1.6.1/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..0df50007a --- /dev/null +++ b/doc/v1.6.1/search/functions_0.js @@ -0,0 +1,69 @@ +var searchData= +[ + ['xcm_5faccept_118',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_119',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_120',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_121',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_122',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_123',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_124',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_125',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_126',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_127',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_128',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_129',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_130',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_131',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_132',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_133',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_134',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_135',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_136',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_137',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_138',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_139',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_140',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_141',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_142',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_143',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_144',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_145',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_146',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_147',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_148',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_149',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_150',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_151',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_152',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_153',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_154',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_155',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_156',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_157',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_158',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_159',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_160',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_161',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_162',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_163',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_164',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_165',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_166',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_167',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_168',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_169',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_170',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_171',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_172',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_173',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_174',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_175',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_176',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_177',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_178',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_179',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_180',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_181',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_182',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_183',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.6.1/search/groups_0.html b/doc/v1.6.1/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/doc/v1.6.1/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ee66bd8d9 --- /dev/null +++ b/doc/v1.6.1/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_238',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.6.1/search/groups_1.html b/doc/v1.6.1/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/doc/v1.6.1/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..73d61cda3 --- /dev/null +++ b/doc/v1.6.1/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_239',['Library Version',['../group__lib__version.html',1,'']]] +]; 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..03626f64a --- /dev/null +++ b/doc/v1.6.1/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/doc/v1.6.1/search/nomatches.html b/doc/v1.6.1/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/doc/v1.6.1/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/doc/v1.6.1/search/pages_0.html b/doc/v1.6.1/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/doc/v1.6.1/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5b432bae5 --- /dev/null +++ b/doc/v1.6.1/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_217',['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..9074198f8 --- /dev/null +++ b/doc/v1.6.1/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/doc/v1.6.1/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.6.1/search/typedefs_0.js b/doc/v1.6.1/search/typedefs_0.js new file mode 100644 index 000000000..9c9abbd1f --- /dev/null +++ b/doc/v1.6.1/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_189',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_190',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/doc/v1.6.1/search/variables_0.html b/doc/v1.6.1/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/doc/v1.6.1/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.6.1/search/variables_0.js b/doc/v1.6.1/search/variables_0.js new file mode 100644 index 000000000..3205b1959 --- /dev/null +++ b/doc/v1.6.1/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_184',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.6.1/search/variables_1.html b/doc/v1.6.1/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/doc/v1.6.1/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.6.1/search/variables_1.js b/doc/v1.6.1/search/variables_1.js new file mode 100644 index 000000000..b2effea2c --- /dev/null +++ b/doc/v1.6.1/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_185',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.6.1/search/variables_2.html b/doc/v1.6.1/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/doc/v1.6.1/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.6.1/search/variables_2.js b/doc/v1.6.1/search/variables_2.js new file mode 100644 index 000000000..5cda77d5d --- /dev/null +++ b/doc/v1.6.1/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_186',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_187',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.6.1/search/variables_3.html b/doc/v1.6.1/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/doc/v1.6.1/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.6.1/search/variables_3.js b/doc/v1.6.1/search/variables_3.js new file mode 100644 index 000000000..df0550499 --- /dev/null +++ b/doc/v1.6.1/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_188',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.6.1/server_accept.png b/doc/v1.6.1/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/doc/v1.6.1/server_accept.png differ diff --git a/doc/v1.6.1/splitbar.png b/doc/v1.6.1/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/doc/v1.6.1/splitbar.png differ diff --git a/doc/v1.6.1/structxcm__addr__host.html b/doc/v1.6.1/structxcm__addr__host.html new file mode 100644 index 000000000..3f7a8dda1 --- /dev/null +++ b/doc/v1.6.1/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..edd281177 --- /dev/null +++ b/doc/v1.6.1/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/doc/v1.6.1/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/doc/v1.6.1/xcm_8h.html b/doc/v1.6.1/xcm_8h.html new file mode 100644 index 000000000..ac6ce725c --- /dev/null +++ b/doc/v1.6.1/xcm_8h.html @@ -0,0 +1,909 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..0c1abbe75 --- /dev/null +++ b/doc/v1.6.1/xcm_8h_source.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1276 struct xcm_socket;
    +
    1277 
    +
    1330 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1331 
    +
    1353 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1354  const struct xcm_attr_map *attrs);
    +
    1355 
    +
    1391 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1392 
    +
    1408 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1409  const struct xcm_attr_map *attrs);
    +
    1410 
    +
    1427 int xcm_close(struct xcm_socket *socket);
    +
    1428 
    +
    1448 void xcm_cleanup(struct xcm_socket *socket);
    +
    1449 
    +
    1468 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1469 
    +
    1489 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1490  const struct xcm_attr_map *attrs);
    +
    1491 
    +
    1514 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1515 
    +
    1539 int 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 
    +
    1610 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1611 
    +
    1653 int xcm_fd(struct xcm_socket *socket);
    +
    1654 
    +
    1699 int xcm_finish(struct xcm_socket *socket);
    +
    1700 
    +
    1741 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1742 
    +
    1757 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1758 
    +
    1775 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1776 
    +
    1791 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..981a37579 --- /dev/null +++ b/doc/v1.6.1/xcm__addr_8h.html @@ -0,0 +1,1070 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..da7f684a4 --- /dev/null +++ b/doc/v1.6.1/xcm__addr_8h_source.html @@ -0,0 +1,199 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    44 enum 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];
    +
    63  } addr;
    +
    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 
    +
    93 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94 
    +
    108 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109  uint16_t *port);
    +
    110 
    +
    124 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125  uint16_t *port);
    +
    126 
    +
    141 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142  uint16_t *port);
    +
    143 
    +
    158 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159  uint16_t *port);
    +
    160 
    +
    174 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175 
    +
    189 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190  size_t capacity);
    +
    191 
    +
    205 int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206  uint16_t *port);
    +
    207 
    +
    223 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224  char *utls_addr_s, size_t capacity);
    +
    225 
    +
    241 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242  char *tls_addr_s, size_t capacity);
    +
    243 
    +
    259 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260  char *tcp_addr_s, size_t capacity);
    +
    261 
    +
    277 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278  char *sctp_addr_s, size_t capacity);
    +
    279 
    +
    294 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295 
    +
    310 int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311 
    +
    327 int 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..598587e22 --- /dev/null +++ b/doc/v1.6.1/xcm__attr_8h.html @@ -0,0 +1,614 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..b98a84f2a --- /dev/null +++ b/doc/v1.6.1/xcm__attr_8h_source.html @@ -0,0 +1,139 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89  const char *value);
    +
    90 
    +
    116 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118 
    +
    135 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136  bool *value);
    +
    137 
    +
    154 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155  int64_t *value);
    +
    156 
    +
    175 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176  char *value, size_t capacity);
    +
    177 
    +
    179 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180  void *value, size_t value_len, void *cb_data);
    +
    181 
    +
    195 void 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..87c03980f --- /dev/null +++ b/doc/v1.6.1/xcm__attr__map_8h.html @@ -0,0 +1,805 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..bc5c9709d --- /dev/null +++ b/doc/v1.6.1/xcm__attr__map_8h_source.html @@ -0,0 +1,194 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    22 #include <xcm_attr_types.h>
    +
    23 
    +
    24 #include <stdbool.h>
    +
    25 #include <stddef.h>
    +
    26 #include <stdint.h>
    +
    27 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name,
    +
    81  bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name,
    +
    95  int64_t attr_value);
    +
    96 
    +
    97 
    +
    107 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108  const char *attr_name,
    +
    109  const char *attr_value);
    +
    110 
    +
    111 
    +
    121 void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    122  const struct xcm_attr_map *src_map);
    +
    123 
    +
    124 
    +
    141 const 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 
    +
    161 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    162  const char *attr_name);
    +
    163 
    +
    164 
    +
    179 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    180  const char *attr_name);
    +
    181 
    +
    182 
    +
    197 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    198  const char *attr_name);
    +
    199 
    +
    208 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    209  const char *attr_name);
    +
    210 
    +
    211 
    +
    220 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    221 
    +
    222 
    +
    230 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    231 
    +
    232 
    +
    236 typedef 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 
    +
    255 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    256  xcm_attr_map_foreach_cb cb, void *user);
    +
    257 
    +
    258 
    +
    267 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    268  const struct xcm_attr_map *attr_map_b);
    +
    269 
    +
    278 void 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)
    +
    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)
    +
    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 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 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..a55719c4c --- /dev/null +++ b/doc/v1.6.1/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..90beeba49 --- /dev/null +++ b/doc/v1.6.1/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..2c8314171 --- /dev/null +++ b/doc/v1.6.1/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..19bfcaf0f --- /dev/null +++ b/doc/v1.6.1/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..13ac41af2 --- /dev/null +++ b/doc/v1.6.1/xcm__version_8h.html @@ -0,0 +1,372 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..f2c01a722 --- /dev/null +++ b/doc/v1.6.1/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    47 unsigned int xcm_version_major(void);
    +
    48 
    +
    55 unsigned int xcm_version_minor(void);
    +
    56 
    +
    62 unsigned int xcm_version_patch(void);
    +
    63 
    +
    72 const char *xcm_version(void);
    +
    73 
    +
    79 unsigned int xcm_version_api_major(void);
    +
    80 
    +
    86 unsigned int xcm_version_api_minor(void);
    +
    87 
    +
    96 const char *xcm_version_api(void);
    +
    97 
    +
    98 #ifdef __cplusplus
    +
    99 }
    +
    100 #endif
    +
    101 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..462aa33c4 --- /dev/null +++ b/doc/v1.6.2/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/doc/v1.6.2/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/doc/v1.6.2/bdwn.png differ diff --git a/doc/v1.6.2/classes.html b/doc/v1.6.2/classes.html new file mode 100644 index 000000000..181f081f8 --- /dev/null +++ b/doc/v1.6.2/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..0002c6394 --- /dev/null +++ b/doc/v1.6.2/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,103 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    file  xcm_version.h [code]
     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.png b/doc/v1.6.2/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/doc/v1.6.2/doc.png differ diff --git a/doc/v1.6.2/doxygen.css b/doc/v1.6.2/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/doc/v1.6.2/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doc/v1.6.2/doxygen.svg b/doc/v1.6.2/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/doc/v1.6.2/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.6.2/dynsections.js b/doc/v1.6.2/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/doc/v1.6.2/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/doc/v1.6.2/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/doc/v1.6.2/folderclosed.png differ diff --git a/doc/v1.6.2/folderopen.png b/doc/v1.6.2/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/doc/v1.6.2/folderopen.png differ diff --git a/doc/v1.6.2/functions.html b/doc/v1.6.2/functions.html new file mode 100644 index 000000000..dec820dec --- /dev/null +++ b/doc/v1.6.2/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..282b17e5d --- /dev/null +++ b/doc/v1.6.2/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.6.2/globals.html b/doc/v1.6.2/globals.html new file mode 100644 index 000000000..5411b45f4 --- /dev/null +++ b/doc/v1.6.2/globals.html @@ -0,0 +1,356 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..63fa88ae2 --- /dev/null +++ b/doc/v1.6.2/globals_defs.html @@ -0,0 +1,135 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.6.2/globals_enum.html b/doc/v1.6.2/globals_enum.html new file mode 100644 index 000000000..23376a187 --- /dev/null +++ b/doc/v1.6.2/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.6.2/globals_eval.html b/doc/v1.6.2/globals_eval.html new file mode 100644 index 000000000..1702dec35 --- /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) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.6.2/globals_func.html b/doc/v1.6.2/globals_func.html new file mode 100644 index 000000000..1e0b43561 --- /dev/null +++ b/doc/v1.6.2/globals_func.html @@ -0,0 +1,272 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - 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..0540ab066 --- /dev/null +++ b/doc/v1.6.2/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + 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..0f08b4af0 --- /dev/null +++ b/doc/v1.6.2/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.6.2/group__lib__version.html b/doc/v1.6.2/group__lib__version.html new file mode 100644 index 000000000..7f0858a9b --- /dev/null +++ b/doc/v1.6.2/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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.6.2/index.html b/doc/v1.6.2/index.html new file mode 100644 index 000000000..497220038 --- /dev/null +++ b/doc/v1.6.2/index.html @@ -0,0 +1,635 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/doc/v1.6.2/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/doc/v1.6.2/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/doc/v1.6.2/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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/modules.html b/doc/v1.6.2/modules.html new file mode 100644 index 000000000..75399f90c --- /dev/null +++ b/doc/v1.6.2/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/doc/v1.6.2/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..e1c7e12e8 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/doc/v1.6.2/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/doc/v1.6.2/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..7130f6379 --- /dev/null +++ b/doc/v1.6.2/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.6.2/search/all_1.html b/doc/v1.6.2/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/doc/v1.6.2/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..69f82ad46 --- /dev/null +++ b/doc/v1.6.2/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_1',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.6.2/search/all_2.html b/doc/v1.6.2/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/doc/v1.6.2/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ae6e4d753 --- /dev/null +++ b/doc/v1.6.2/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_2',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.6.2/search/all_3.html b/doc/v1.6.2/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/doc/v1.6.2/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..551054f77 --- /dev/null +++ b/doc/v1.6.2/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_3',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_4',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.6.2/search/all_4.html b/doc/v1.6.2/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/doc/v1.6.2/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..fd3d5a006 --- /dev/null +++ b/doc/v1.6.2/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_5',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.6.2/search/all_5.html b/doc/v1.6.2/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/doc/v1.6.2/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5273f9abc --- /dev/null +++ b/doc/v1.6.2/search/all_5.js @@ -0,0 +1,106 @@ +var searchData= +[ + ['xcm_2eh_6',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_7',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_8',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_9',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_10',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_11',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_12',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_13',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_14',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_15',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_16',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_17',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_18',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_19',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_20',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_21',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_22',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_23',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_24',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_25',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_26',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_27',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_28',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_29',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_30',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',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_5fint64_32',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_33',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_34',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['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_5fbool_37',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_38',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_39',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_40',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_41',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_42',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_43',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_44',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_45',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_46',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_47',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_48',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_49',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_50',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_51',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_52',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_53',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_54',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_55',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_56',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_57',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_58',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_59',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_60',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_61',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_62',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_63',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_64',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_65',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_66',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_67',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_68',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_69',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_70',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_71',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_72',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_73',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_74',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_75',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_76',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_77',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_78',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_79',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_80',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_81',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_82',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_83',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_84',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_85',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_86',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_87',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_88',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_89',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_90',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_91',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_92',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_93',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_94',['XCM_VERSION',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_95',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_96',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_97',['XCM_VERSION_API',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_98',['XCM_VERSION_API_MAJOR',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_99',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_100',['XCM_VERSION_API_MINOR',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_101',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_102',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_103',['XCM_VERSION_MAJOR',['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_104',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_105',['XCM_VERSION_MINOR',['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_106',['XCM_VERSION_PATCH',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_107',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_108',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.6.2/search/all_6.html b/doc/v1.6.2/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/doc/v1.6.2/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5debab10e --- /dev/null +++ b/doc/v1.6.2/search/all_6.js @@ -0,0 +1,119 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_14',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_15',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_16',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_17',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_18',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_19',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_20',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_21',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_22',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_23',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_24',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_25',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_26',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_27',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_28',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_29',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_30',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_31',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_32',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_33',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_34',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_35',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_36',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_37',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_38',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_39',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_40',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_41',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',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#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_51',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',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#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_59',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_60',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_61',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_62',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_63',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_84',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',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#a4d8d62a9625b49993b7d6ec03de8e765',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#ad52a0d86b7b5bf802835758cc9251e2e',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#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_98',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',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',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_109',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_110',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_111',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_112',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_113',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_114',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_115',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_116',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_117',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_118',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_119',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_120',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_121',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_122',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_123',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.6.2/search/classes_0.html b/doc/v1.6.2/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/doc/v1.6.2/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..a2e56ee61 --- /dev/null +++ b/doc/v1.6.2/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_109',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_110',['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..a933eea1a --- /dev/null +++ b/doc/v1.6.2/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/doc/v1.6.2/search/defines_0.html b/doc/v1.6.2/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/doc/v1.6.2/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..e8b050945 --- /dev/null +++ b/doc/v1.6.2/search/defines_0.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_196',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_197',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_198',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_199',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_200',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_201',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_202',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_203',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_204',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_205',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_206',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_207',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_208',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_209',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_210',['XCM_VERSION',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_211',['XCM_VERSION_API',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_212',['XCM_VERSION_API_MAJOR',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_213',['XCM_VERSION_API_MINOR',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_214',['XCM_VERSION_MAJOR',['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_215',['XCM_VERSION_MINOR',['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_216',['XCM_VERSION_PATCH',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]] +]; diff --git a/doc/v1.6.2/search/enums_0.html b/doc/v1.6.2/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/doc/v1.6.2/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..14e43419a --- /dev/null +++ b/doc/v1.6.2/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_191',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.6.2/search/enumvalues_0.html b/doc/v1.6.2/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/doc/v1.6.2/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..47eaf0ba8 --- /dev/null +++ b/doc/v1.6.2/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_192',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_193',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_194',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_195',['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.html b/doc/v1.6.2/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/doc/v1.6.2/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..49cc3f564 --- /dev/null +++ b/doc/v1.6.2/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_111',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_112',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_113',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_114',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_115',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_116',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_117',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/doc/v1.6.2/search/functions_0.html b/doc/v1.6.2/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/doc/v1.6.2/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..0df50007a --- /dev/null +++ b/doc/v1.6.2/search/functions_0.js @@ -0,0 +1,69 @@ +var searchData= +[ + ['xcm_5faccept_118',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_119',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_120',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_121',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_122',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_123',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_124',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_125',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_126',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_127',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_128',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_129',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_130',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_131',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_132',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_133',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_134',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_135',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_136',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_137',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_138',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_139',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_140',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_141',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_142',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_143',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_144',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_145',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_146',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_147',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_148',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_149',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_150',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_151',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_152',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_153',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_154',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_155',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_156',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_157',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_158',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_159',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_160',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_161',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_162',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_163',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_164',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_165',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_166',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_167',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_168',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_169',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_170',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_171',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_172',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_173',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_174',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_175',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_176',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_177',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_178',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_179',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_180',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_181',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_182',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_183',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.6.2/search/groups_0.html b/doc/v1.6.2/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/doc/v1.6.2/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ee66bd8d9 --- /dev/null +++ b/doc/v1.6.2/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_238',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.6.2/search/groups_1.html b/doc/v1.6.2/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/doc/v1.6.2/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..73d61cda3 --- /dev/null +++ b/doc/v1.6.2/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_239',['Library Version',['../group__lib__version.html',1,'']]] +]; 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..03626f64a --- /dev/null +++ b/doc/v1.6.2/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/doc/v1.6.2/search/nomatches.html b/doc/v1.6.2/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/doc/v1.6.2/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/doc/v1.6.2/search/pages_0.html b/doc/v1.6.2/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/doc/v1.6.2/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5b432bae5 --- /dev/null +++ b/doc/v1.6.2/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_217',['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..9074198f8 --- /dev/null +++ b/doc/v1.6.2/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/doc/v1.6.2/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.6.2/search/typedefs_0.js b/doc/v1.6.2/search/typedefs_0.js new file mode 100644 index 000000000..9c9abbd1f --- /dev/null +++ b/doc/v1.6.2/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_189',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_190',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/doc/v1.6.2/search/variables_0.html b/doc/v1.6.2/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/doc/v1.6.2/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.6.2/search/variables_0.js b/doc/v1.6.2/search/variables_0.js new file mode 100644 index 000000000..3205b1959 --- /dev/null +++ b/doc/v1.6.2/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_184',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.6.2/search/variables_1.html b/doc/v1.6.2/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/doc/v1.6.2/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.6.2/search/variables_1.js b/doc/v1.6.2/search/variables_1.js new file mode 100644 index 000000000..b2effea2c --- /dev/null +++ b/doc/v1.6.2/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_185',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.6.2/search/variables_2.html b/doc/v1.6.2/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/doc/v1.6.2/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.6.2/search/variables_2.js b/doc/v1.6.2/search/variables_2.js new file mode 100644 index 000000000..5cda77d5d --- /dev/null +++ b/doc/v1.6.2/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_186',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_187',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.6.2/search/variables_3.html b/doc/v1.6.2/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/doc/v1.6.2/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.6.2/search/variables_3.js b/doc/v1.6.2/search/variables_3.js new file mode 100644 index 000000000..df0550499 --- /dev/null +++ b/doc/v1.6.2/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_188',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.6.2/server_accept.png b/doc/v1.6.2/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/doc/v1.6.2/server_accept.png differ diff --git a/doc/v1.6.2/splitbar.png b/doc/v1.6.2/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/doc/v1.6.2/splitbar.png differ diff --git a/doc/v1.6.2/structxcm__addr__host.html b/doc/v1.6.2/structxcm__addr__host.html new file mode 100644 index 000000000..2dc76662e --- /dev/null +++ b/doc/v1.6.2/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..a44b7242b --- /dev/null +++ b/doc/v1.6.2/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/doc/v1.6.2/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/doc/v1.6.2/xcm_8h.html b/doc/v1.6.2/xcm_8h.html new file mode 100644 index 000000000..b94adbb80 --- /dev/null +++ b/doc/v1.6.2/xcm_8h.html @@ -0,0 +1,909 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..5ef09a82a --- /dev/null +++ b/doc/v1.6.2/xcm_8h_source.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1293 struct xcm_socket;
    +
    1294 
    +
    1347 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1348 
    +
    1370 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1371  const struct xcm_attr_map *attrs);
    +
    1372 
    +
    1408 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1409 
    +
    1425 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1426  const struct xcm_attr_map *attrs);
    +
    1427 
    +
    1444 int xcm_close(struct xcm_socket *socket);
    +
    1445 
    +
    1465 void xcm_cleanup(struct xcm_socket *socket);
    +
    1466 
    +
    1485 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1486 
    +
    1506 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1507  const struct xcm_attr_map *attrs);
    +
    1508 
    +
    1531 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1532 
    +
    1556 int 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 
    +
    1627 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1628 
    +
    1670 int xcm_fd(struct xcm_socket *socket);
    +
    1671 
    +
    1716 int xcm_finish(struct xcm_socket *socket);
    +
    1717 
    +
    1758 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1759 
    +
    1774 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1775 
    +
    1792 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1793 
    +
    1808 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..4ed5e4e31 --- /dev/null +++ b/doc/v1.6.2/xcm__addr_8h.html @@ -0,0 +1,1070 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..c65373e69 --- /dev/null +++ b/doc/v1.6.2/xcm__addr_8h_source.html @@ -0,0 +1,199 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    44 enum 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];
    +
    63  } addr;
    +
    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 
    +
    93 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94 
    +
    108 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109  uint16_t *port);
    +
    110 
    +
    124 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125  uint16_t *port);
    +
    126 
    +
    141 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142  uint16_t *port);
    +
    143 
    +
    158 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159  uint16_t *port);
    +
    160 
    +
    174 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175 
    +
    189 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190  size_t capacity);
    +
    191 
    +
    205 int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206  uint16_t *port);
    +
    207 
    +
    223 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224  char *utls_addr_s, size_t capacity);
    +
    225 
    +
    241 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242  char *tls_addr_s, size_t capacity);
    +
    243 
    +
    259 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260  char *tcp_addr_s, size_t capacity);
    +
    261 
    +
    277 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278  char *sctp_addr_s, size_t capacity);
    +
    279 
    +
    294 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295 
    +
    310 int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311 
    +
    327 int 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..4f8547578 --- /dev/null +++ b/doc/v1.6.2/xcm__attr_8h.html @@ -0,0 +1,614 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..ba25a46b6 --- /dev/null +++ b/doc/v1.6.2/xcm__attr_8h_source.html @@ -0,0 +1,139 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89  const char *value);
    +
    90 
    +
    116 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118 
    +
    135 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136  bool *value);
    +
    137 
    +
    154 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155  int64_t *value);
    +
    156 
    +
    175 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176  char *value, size_t capacity);
    +
    177 
    +
    179 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180  void *value, size_t value_len, void *cb_data);
    +
    181 
    +
    195 void 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..7c946b4d7 --- /dev/null +++ b/doc/v1.6.2/xcm__attr__map_8h.html @@ -0,0 +1,805 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..56f148cdb --- /dev/null +++ b/doc/v1.6.2/xcm__attr__map_8h_source.html @@ -0,0 +1,194 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    22 #include <xcm_attr_types.h>
    +
    23 
    +
    24 #include <stdbool.h>
    +
    25 #include <stddef.h>
    +
    26 #include <stdint.h>
    +
    27 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name,
    +
    81  bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name,
    +
    95  int64_t attr_value);
    +
    96 
    +
    97 
    +
    107 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108  const char *attr_name,
    +
    109  const char *attr_value);
    +
    110 
    +
    111 
    +
    121 void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    122  const struct xcm_attr_map *src_map);
    +
    123 
    +
    124 
    +
    141 const 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 
    +
    161 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    162  const char *attr_name);
    +
    163 
    +
    164 
    +
    179 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    180  const char *attr_name);
    +
    181 
    +
    182 
    +
    197 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    198  const char *attr_name);
    +
    199 
    +
    208 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    209  const char *attr_name);
    +
    210 
    +
    211 
    +
    220 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    221 
    +
    222 
    +
    230 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    231 
    +
    232 
    +
    236 typedef 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 
    +
    255 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    256  xcm_attr_map_foreach_cb cb, void *user);
    +
    257 
    +
    258 
    +
    267 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    268  const struct xcm_attr_map *attr_map_b);
    +
    269 
    +
    278 void 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)
    +
    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)
    +
    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 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 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..2a397a58e --- /dev/null +++ b/doc/v1.6.2/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..0c957c77e --- /dev/null +++ b/doc/v1.6.2/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..be170e1c1 --- /dev/null +++ b/doc/v1.6.2/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..453b089de --- /dev/null +++ b/doc/v1.6.2/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..e364dd61a --- /dev/null +++ b/doc/v1.6.2/xcm__version_8h.html @@ -0,0 +1,372 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..837e59c9f --- /dev/null +++ b/doc/v1.6.2/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    47 unsigned int xcm_version_major(void);
    +
    48 
    +
    55 unsigned int xcm_version_minor(void);
    +
    56 
    +
    62 unsigned int xcm_version_patch(void);
    +
    63 
    +
    72 const char *xcm_version(void);
    +
    73 
    +
    79 unsigned int xcm_version_api_major(void);
    +
    80 
    +
    86 unsigned int xcm_version_api_minor(void);
    +
    87 
    +
    96 const char *xcm_version_api(void);
    +
    97 
    +
    98 #ifdef __cplusplus
    +
    99 }
    +
    100 #endif
    +
    101 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..7a5dcce2e --- /dev/null +++ b/doc/v1.7.0/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/doc/v1.7.0/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/doc/v1.7.0/bdwn.png differ diff --git a/doc/v1.7.0/classes.html b/doc/v1.7.0/classes.html new file mode 100644 index 000000000..532352b4a --- /dev/null +++ b/doc/v1.7.0/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..71133d24f --- /dev/null +++ b/doc/v1.7.0/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,103 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    file  xcm_version.h [code]
     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.png b/doc/v1.7.0/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/doc/v1.7.0/doc.png differ diff --git a/doc/v1.7.0/doxygen.css b/doc/v1.7.0/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/doc/v1.7.0/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doc/v1.7.0/doxygen.svg b/doc/v1.7.0/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/doc/v1.7.0/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.7.0/dynsections.js b/doc/v1.7.0/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/doc/v1.7.0/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/doc/v1.7.0/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/doc/v1.7.0/folderclosed.png differ diff --git a/doc/v1.7.0/folderopen.png b/doc/v1.7.0/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/doc/v1.7.0/folderopen.png differ diff --git a/doc/v1.7.0/functions.html b/doc/v1.7.0/functions.html new file mode 100644 index 000000000..4c015fcc0 --- /dev/null +++ b/doc/v1.7.0/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..9d9149f50 --- /dev/null +++ b/doc/v1.7.0/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.7.0/globals.html b/doc/v1.7.0/globals.html new file mode 100644 index 000000000..9bf5a583c --- /dev/null +++ b/doc/v1.7.0/globals.html @@ -0,0 +1,365 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..99922fba9 --- /dev/null +++ b/doc/v1.7.0/globals_defs.html @@ -0,0 +1,135 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.7.0/globals_enum.html b/doc/v1.7.0/globals_enum.html new file mode 100644 index 000000000..66798a00c --- /dev/null +++ b/doc/v1.7.0/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.7.0/globals_eval.html b/doc/v1.7.0/globals_eval.html new file mode 100644 index 000000000..c12269258 --- /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) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.7.0/globals_func.html b/doc/v1.7.0/globals_func.html new file mode 100644 index 000000000..95a652e49 --- /dev/null +++ b/doc/v1.7.0/globals_func.html @@ -0,0 +1,281 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - 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..625ab605c --- /dev/null +++ b/doc/v1.7.0/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + 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..310376143 --- /dev/null +++ b/doc/v1.7.0/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..d39fbfe5f --- /dev/null +++ b/doc/v1.7.0/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..6c328fb8a --- /dev/null +++ b/doc/v1.7.0/index.html @@ -0,0 +1,651 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/doc/v1.7.0/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/doc/v1.7.0/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/doc/v1.7.0/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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..6a140e8ce --- /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:"Modules",url:"modules.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/modules.html b/doc/v1.7.0/modules.html new file mode 100644 index 000000000..cbec9f2f0 --- /dev/null +++ b/doc/v1.7.0/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/doc/v1.7.0/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..e1c7e12e8 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/doc/v1.7.0/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/doc/v1.7.0/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..869f460ae --- /dev/null +++ b/doc/v1.7.0/search/all_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['api_20version_1',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.7.0/search/all_1.html b/doc/v1.7.0/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/doc/v1.7.0/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..204c38c05 --- /dev/null +++ b/doc/v1.7.0/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_2',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.7.0/search/all_2.html b/doc/v1.7.0/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/doc/v1.7.0/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..d6a623719 --- /dev/null +++ b/doc/v1.7.0/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_3',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.7.0/search/all_3.html b/doc/v1.7.0/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/doc/v1.7.0/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..e908022ab --- /dev/null +++ b/doc/v1.7.0/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_4',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_5',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.7.0/search/all_4.html b/doc/v1.7.0/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/doc/v1.7.0/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..6d0e67254 --- /dev/null +++ b/doc/v1.7.0/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_6',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.7.0/search/all_5.html b/doc/v1.7.0/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/doc/v1.7.0/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..4f4fb05a9 --- /dev/null +++ b/doc/v1.7.0/search/all_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_7',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.7.0/search/all_6.html b/doc/v1.7.0/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/doc/v1.7.0/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5411ca92b --- /dev/null +++ b/doc/v1.7.0/search/all_6.js @@ -0,0 +1,109 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_14',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_15',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_16',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_17',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_18',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_19',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_20',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_21',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_22',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_23',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_24',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_25',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_26',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_27',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_28',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_29',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_30',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_31',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_32',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_33',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_34',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_35',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_36',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_37',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_38',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_39',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_40',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_41',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_42',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_43',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_44',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_45',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_46',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_47',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_48',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_49',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_50',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_51',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_52',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_53',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_54',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_55',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_56',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',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_5fint64_60',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_61',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_62',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_63',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_64',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',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_5fbtls_5fproto_69',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_70',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_71',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_72',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_73',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_74',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_75',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_76',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_77',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_78',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_79',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_80',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_81',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_82',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_83',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_84',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_85',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_86',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_87',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_88',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_89',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_90',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_91',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_92',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_93',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_94',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_95',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_96',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_97',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_98',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_99',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_100',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_101',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_102',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_103',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_104',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_105',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_106',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_107',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_108',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_109',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_110',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_111',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_112',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_113',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.7.0/search/classes_0.html b/doc/v1.7.0/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/doc/v1.7.0/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..a2d7eb9fa --- /dev/null +++ b/doc/v1.7.0/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_114',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_115',['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..a933eea1a --- /dev/null +++ b/doc/v1.7.0/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/doc/v1.7.0/search/defines_0.html b/doc/v1.7.0/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/doc/v1.7.0/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..682d292bb --- /dev/null +++ b/doc/v1.7.0/search/defines_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_204',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_205',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_206',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_207',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_208',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_209',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_210',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_211',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_212',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_213',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_214',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_215',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_216',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_217',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.7.0/search/enums_0.html b/doc/v1.7.0/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/doc/v1.7.0/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..e8e5c3e00 --- /dev/null +++ b/doc/v1.7.0/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_199',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.7.0/search/enumvalues_0.html b/doc/v1.7.0/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/doc/v1.7.0/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..7f01c35ec --- /dev/null +++ b/doc/v1.7.0/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_200',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_201',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_202',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_203',['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.html b/doc/v1.7.0/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/doc/v1.7.0/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..54752dab4 --- /dev/null +++ b/doc/v1.7.0/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_116',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_117',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_118',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_119',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_120',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_121',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_122',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/doc/v1.7.0/search/functions_0.html b/doc/v1.7.0/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/doc/v1.7.0/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..2a89bbc22 --- /dev/null +++ b/doc/v1.7.0/search/functions_0.js @@ -0,0 +1,72 @@ +var searchData= +[ + ['xcm_5faccept_123',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_124',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_125',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_126',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_127',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_128',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_129',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_130',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_131',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_132',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_133',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_134',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_135',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_136',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_137',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_138',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_139',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_140',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_141',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_142',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_143',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_144',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_145',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_146',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_147',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_148',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_149',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_150',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_151',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_152',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_153',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_154',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_155',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_156',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_157',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_158',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_159',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_160',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_161',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_162',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_163',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_164',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_165',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_166',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_167',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_168',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_169',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_170',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_171',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_172',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_173',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_174',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_175',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_176',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_177',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_178',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_179',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_180',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_181',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_182',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_183',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_184',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_185',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_186',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_187',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_188',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_189',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_190',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_191',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.7.0/search/groups_0.html b/doc/v1.7.0/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/doc/v1.7.0/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..6e8756088 --- /dev/null +++ b/doc/v1.7.0/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_218',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.7.0/search/groups_1.html b/doc/v1.7.0/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/doc/v1.7.0/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..b1f6ca015 --- /dev/null +++ b/doc/v1.7.0/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_219',['Library Version',['../group__lib__version.html',1,'']]] +]; 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..03626f64a --- /dev/null +++ b/doc/v1.7.0/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/doc/v1.7.0/search/nomatches.html b/doc/v1.7.0/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/doc/v1.7.0/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/doc/v1.7.0/search/pages_0.html b/doc/v1.7.0/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/doc/v1.7.0/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..0a6228b41 --- /dev/null +++ b/doc/v1.7.0/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_220',['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..9074198f8 --- /dev/null +++ b/doc/v1.7.0/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/doc/v1.7.0/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.7.0/search/typedefs_0.js b/doc/v1.7.0/search/typedefs_0.js new file mode 100644 index 000000000..3c54eb8c2 --- /dev/null +++ b/doc/v1.7.0/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_197',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_198',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/doc/v1.7.0/search/variables_0.html b/doc/v1.7.0/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/doc/v1.7.0/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.7.0/search/variables_0.js b/doc/v1.7.0/search/variables_0.js new file mode 100644 index 000000000..a28fc1b94 --- /dev/null +++ b/doc/v1.7.0/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_192',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.7.0/search/variables_1.html b/doc/v1.7.0/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/doc/v1.7.0/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.7.0/search/variables_1.js b/doc/v1.7.0/search/variables_1.js new file mode 100644 index 000000000..824d8a8d5 --- /dev/null +++ b/doc/v1.7.0/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_193',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.7.0/search/variables_2.html b/doc/v1.7.0/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/doc/v1.7.0/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.7.0/search/variables_2.js b/doc/v1.7.0/search/variables_2.js new file mode 100644 index 000000000..cb99ba754 --- /dev/null +++ b/doc/v1.7.0/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_194',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_195',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.7.0/search/variables_3.html b/doc/v1.7.0/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/doc/v1.7.0/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.7.0/search/variables_3.js b/doc/v1.7.0/search/variables_3.js new file mode 100644 index 000000000..f9671eab9 --- /dev/null +++ b/doc/v1.7.0/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_196',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.7.0/server_accept.png b/doc/v1.7.0/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/doc/v1.7.0/server_accept.png differ diff --git a/doc/v1.7.0/splitbar.png b/doc/v1.7.0/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/doc/v1.7.0/splitbar.png differ diff --git a/doc/v1.7.0/structxcm__addr__host.html b/doc/v1.7.0/structxcm__addr__host.html new file mode 100644 index 000000000..2b499b84e --- /dev/null +++ b/doc/v1.7.0/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..33d0c2049 --- /dev/null +++ b/doc/v1.7.0/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/doc/v1.7.0/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/doc/v1.7.0/xcm_8h.html b/doc/v1.7.0/xcm_8h.html new file mode 100644 index 000000000..f93fdd38a --- /dev/null +++ b/doc/v1.7.0/xcm_8h.html @@ -0,0 +1,910 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..f54b170eb --- /dev/null +++ b/doc/v1.7.0/xcm_8h_source.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1319 struct xcm_socket;
    +
    1320 
    +
    1373 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1374 
    +
    1396 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1397  const struct xcm_attr_map *attrs);
    +
    1398 
    +
    1434 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1435 
    +
    1451 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1452  const struct xcm_attr_map *attrs);
    +
    1453 
    +
    1470 int xcm_close(struct xcm_socket *socket);
    +
    1471 
    +
    1491 void xcm_cleanup(struct xcm_socket *socket);
    +
    1492 
    +
    1511 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1512 
    +
    1532 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1533  const struct xcm_attr_map *attrs);
    +
    1534 
    +
    1557 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1558 
    +
    1582 int 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 
    +
    1653 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1654 
    +
    1702 int xcm_fd(struct xcm_socket *socket);
    +
    1703 
    +
    1749 int xcm_finish(struct xcm_socket *socket);
    +
    1750 
    +
    1791 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1792 
    +
    1807 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1808 
    +
    1825 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1826 
    +
    1841 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..a93c84822 --- /dev/null +++ b/doc/v1.7.0/xcm__addr_8h.html @@ -0,0 +1,1070 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..04eda856c --- /dev/null +++ b/doc/v1.7.0/xcm__addr_8h_source.html @@ -0,0 +1,199 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    44 enum 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];
    +
    63  } addr;
    +
    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 
    +
    93 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94 
    +
    108 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109  uint16_t *port);
    +
    110 
    +
    124 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125  uint16_t *port);
    +
    126 
    +
    141 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142  uint16_t *port);
    +
    143 
    +
    158 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159  uint16_t *port);
    +
    160 
    +
    174 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175 
    +
    189 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190  size_t capacity);
    +
    191 
    +
    205 int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206  uint16_t *port);
    +
    207 
    +
    223 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224  char *utls_addr_s, size_t capacity);
    +
    225 
    +
    241 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242  char *tls_addr_s, size_t capacity);
    +
    243 
    +
    259 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260  char *tcp_addr_s, size_t capacity);
    +
    261 
    +
    277 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278  char *sctp_addr_s, size_t capacity);
    +
    279 
    +
    294 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295 
    +
    310 int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311 
    +
    327 int 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..24f7f889b --- /dev/null +++ b/doc/v1.7.0/xcm__attr_8h.html @@ -0,0 +1,674 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..a976ecf92 --- /dev/null +++ b/doc/v1.7.0/xcm__attr_8h_source.html @@ -0,0 +1,143 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89  const char *value);
    +
    90 
    +
    116 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118 
    +
    135 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136  bool *value);
    +
    137 
    +
    154 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155  int64_t *value);
    +
    156 
    +
    175 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176  char *value, size_t capacity);
    +
    177 
    +
    195 int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    196  void *value, size_t capacity);
    +
    197 
    +
    199 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    200  void *value, size_t value_len, void *cb_data);
    +
    201 
    +
    215 void 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..6ad1cb32c --- /dev/null +++ b/doc/v1.7.0/xcm__attr__map_8h.html @@ -0,0 +1,898 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..c353501cc --- /dev/null +++ b/doc/v1.7.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) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    22 #include <xcm_attr_types.h>
    +
    23 
    +
    24 #include <stdbool.h>
    +
    25 #include <stddef.h>
    +
    26 #include <stdint.h>
    +
    27 
    +
    28 struct xcm_attr_map;
    +
    29 
    +
    30 
    +
    36 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37 
    +
    38 
    +
    46 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47 
    +
    65 void 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 
    +
    79 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80  const char *attr_name, bool attr_value);
    +
    81 
    +
    82 
    +
    92 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    93  const char *attr_name, int64_t attr_value);
    +
    94 
    +
    95 
    +
    105 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    106  const char *attr_name, const char *attr_value);
    +
    107 
    +
    108 
    +
    118 void 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 
    +
    132 void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    133  const struct xcm_attr_map *src_map);
    +
    134 
    +
    135 
    +
    152 const 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 
    +
    172 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    173  const char *attr_name);
    +
    174 
    +
    175 
    +
    190 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    191  const char *attr_name);
    +
    192 
    +
    193 
    +
    208 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    209  const char *attr_name);
    +
    210 
    +
    225 const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    226  const char *attr_name);
    +
    227 
    +
    236 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    237  const char *attr_name);
    +
    238 
    +
    239 
    +
    248 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    249 
    +
    250 
    +
    258 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    259 
    +
    260 
    +
    264 typedef 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 
    +
    283 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    284  xcm_attr_map_foreach_cb cb, void *user);
    +
    285 
    +
    286 
    +
    295 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    296  const struct xcm_attr_map *attr_map_b);
    +
    297 
    +
    306 void 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)
    +
    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)
    +
    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_bin(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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..97d58a88a --- /dev/null +++ b/doc/v1.7.0/xcm__attr__types_8h.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..385753607 --- /dev/null +++ b/doc/v1.7.0/xcm__attr__types_8h_source.html @@ -0,0 +1,105 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + +
    28 };
    +
    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..23dbc106d --- /dev/null +++ b/doc/v1.7.0/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..681922d4b --- /dev/null +++ b/doc/v1.7.0/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..719758159 --- /dev/null +++ b/doc/v1.7.0/xcm__version_8h.html @@ -0,0 +1,266 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..b09084ea7 --- /dev/null +++ b/doc/v1.7.0/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    59 unsigned int xcm_version_major(void);
    +
    60 
    +
    67 unsigned int xcm_version_minor(void);
    +
    68 
    +
    74 unsigned int xcm_version_patch(void);
    +
    75 
    +
    84 const char *xcm_version(void);
    +
    85 
    +
    91 unsigned int xcm_version_api_major(void);
    +
    92 
    +
    98 unsigned int xcm_version_api_minor(void);
    +
    99 
    +
    108 const char *xcm_version_api(void);
    +
    109 
    +
    110 #ifdef __cplusplus
    +
    111 }
    +
    112 #endif
    +
    113 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..4d341168f --- /dev/null +++ b/doc/v1.8.0/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/doc/v1.8.0/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/doc/v1.8.0/bdwn.png differ diff --git a/doc/v1.8.0/classes.html b/doc/v1.8.0/classes.html new file mode 100644 index 000000000..d99228d8a --- /dev/null +++ b/doc/v1.8.0/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..f612381d2 --- /dev/null +++ b/doc/v1.8.0/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,103 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    file  xcm_version.h [code]
     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.png b/doc/v1.8.0/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/doc/v1.8.0/doc.png differ diff --git a/doc/v1.8.0/doxygen.css b/doc/v1.8.0/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/doc/v1.8.0/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doc/v1.8.0/doxygen.svg b/doc/v1.8.0/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/doc/v1.8.0/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.8.0/dynsections.js b/doc/v1.8.0/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/doc/v1.8.0/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/doc/v1.8.0/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/doc/v1.8.0/folderclosed.png differ diff --git a/doc/v1.8.0/folderopen.png b/doc/v1.8.0/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/doc/v1.8.0/folderopen.png differ diff --git a/doc/v1.8.0/functions.html b/doc/v1.8.0/functions.html new file mode 100644 index 000000000..690bd339a --- /dev/null +++ b/doc/v1.8.0/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..0ae6364da --- /dev/null +++ b/doc/v1.8.0/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.8.0/globals.html b/doc/v1.8.0/globals.html new file mode 100644 index 000000000..eb6ea2038 --- /dev/null +++ b/doc/v1.8.0/globals.html @@ -0,0 +1,380 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..13df5a2eb --- /dev/null +++ b/doc/v1.8.0/globals_defs.html @@ -0,0 +1,135 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.8.0/globals_enum.html b/doc/v1.8.0/globals_enum.html new file mode 100644 index 000000000..394aaa879 --- /dev/null +++ b/doc/v1.8.0/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.8.0/globals_eval.html b/doc/v1.8.0/globals_eval.html new file mode 100644 index 000000000..ffb3a1100 --- /dev/null +++ b/doc/v1.8.0/globals_eval.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.8.0/globals_func.html b/doc/v1.8.0/globals_func.html new file mode 100644 index 000000000..411967477 --- /dev/null +++ b/doc/v1.8.0/globals_func.html @@ -0,0 +1,293 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - 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..79cb8ed5c --- /dev/null +++ b/doc/v1.8.0/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + 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..96e8c1092 --- /dev/null +++ b/doc/v1.8.0/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..6a6f84eb7 --- /dev/null +++ b/doc/v1.8.0/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..8f5b08002 --- /dev/null +++ b/doc/v1.8.0/index.html @@ -0,0 +1,653 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/doc/v1.8.0/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/doc/v1.8.0/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/doc/v1.8.0/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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..6a140e8ce --- /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:"Modules",url:"modules.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/modules.html b/doc/v1.8.0/modules.html new file mode 100644 index 000000000..7aa13f602 --- /dev/null +++ b/doc/v1.8.0/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/doc/v1.8.0/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..e1c7e12e8 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/doc/v1.8.0/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/doc/v1.8.0/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..869f460ae --- /dev/null +++ b/doc/v1.8.0/search/all_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['api_20version_1',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.8.0/search/all_1.html b/doc/v1.8.0/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/doc/v1.8.0/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..204c38c05 --- /dev/null +++ b/doc/v1.8.0/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_2',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.8.0/search/all_2.html b/doc/v1.8.0/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/doc/v1.8.0/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..d6a623719 --- /dev/null +++ b/doc/v1.8.0/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_3',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.8.0/search/all_3.html b/doc/v1.8.0/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/doc/v1.8.0/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..e908022ab --- /dev/null +++ b/doc/v1.8.0/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_4',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_5',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.8.0/search/all_4.html b/doc/v1.8.0/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/doc/v1.8.0/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..6d0e67254 --- /dev/null +++ b/doc/v1.8.0/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_6',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.8.0/search/all_5.html b/doc/v1.8.0/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/doc/v1.8.0/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..4f4fb05a9 --- /dev/null +++ b/doc/v1.8.0/search/all_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_7',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.8.0/search/all_6.html b/doc/v1.8.0/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/doc/v1.8.0/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..ce7988914 --- /dev/null +++ b/doc/v1.8.0/search/all_6.js @@ -0,0 +1,114 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_14',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_15',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_16',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_17',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_18',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_19',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_20',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_21',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_22',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_23',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_24',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_25',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_26',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_27',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_28',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_29',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_30',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_31',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_32',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_33',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_34',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_35',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_36',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_37',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_38',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_39',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_40',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_41',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_42',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_43',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_44',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_45',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_46',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_47',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_48',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_49',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_50',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_51',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_52',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_53',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_54',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_55',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_56',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_57',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_58',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_59',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_60',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_61',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_62',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_63',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_64',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_65',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_66',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_67',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_68',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_69',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_70',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_71',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_72',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_73',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_74',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_75',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_76',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_77',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_78',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_79',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_80',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_81',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_82',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_83',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_84',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_85',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_86',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_87',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_88',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_89',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_90',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_91',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_92',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_93',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_94',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_95',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_96',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_97',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_98',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_99',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_100',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_101',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_102',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_103',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_104',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_105',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_106',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_107',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_108',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_109',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_110',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_111',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_112',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_113',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_114',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_115',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_116',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_117',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_118',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.8.0/search/classes_0.html b/doc/v1.8.0/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/doc/v1.8.0/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..b172d81d9 --- /dev/null +++ b/doc/v1.8.0/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_119',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_120',['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..a933eea1a --- /dev/null +++ b/doc/v1.8.0/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/doc/v1.8.0/search/defines_0.html b/doc/v1.8.0/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/doc/v1.8.0/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..b386e5aea --- /dev/null +++ b/doc/v1.8.0/search/defines_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_214',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_215',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_216',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_217',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_218',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_219',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_220',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_221',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_222',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_223',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_224',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_225',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_226',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_227',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.8.0/search/enums_0.html b/doc/v1.8.0/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/doc/v1.8.0/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..46569d8f3 --- /dev/null +++ b/doc/v1.8.0/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_208',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.8.0/search/enumvalues_0.html b/doc/v1.8.0/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/doc/v1.8.0/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..d844bf500 --- /dev/null +++ b/doc/v1.8.0/search/enumvalues_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_209',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_210',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_211',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_212',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_213',['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.html b/doc/v1.8.0/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/doc/v1.8.0/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..b900f058d --- /dev/null +++ b/doc/v1.8.0/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_121',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_122',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_123',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_124',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_125',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_126',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_127',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/doc/v1.8.0/search/functions_0.html b/doc/v1.8.0/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/doc/v1.8.0/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..70ba8daff --- /dev/null +++ b/doc/v1.8.0/search/functions_0.js @@ -0,0 +1,76 @@ +var searchData= +[ + ['xcm_5faccept_128',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_129',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_130',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_131',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_132',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_133',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_134',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_135',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_136',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_137',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_138',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_139',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_140',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_141',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_142',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_143',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_144',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_145',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_146',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_147',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_148',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_149',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_150',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_151',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_152',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_153',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_154',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_155',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_156',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_157',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_158',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_159',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_160',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_161',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_162',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_163',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_164',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_165',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_166',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_167',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_168',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_169',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_170',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_171',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_172',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_173',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_174',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_175',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_176',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_177',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_178',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_179',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_180',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_181',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_182',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_183',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_184',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_185',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_186',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_187',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_188',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_189',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_190',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_191',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_192',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_193',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_194',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_195',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_196',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_197',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_198',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_199',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_200',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.8.0/search/groups_0.html b/doc/v1.8.0/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/doc/v1.8.0/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..b6844392a --- /dev/null +++ b/doc/v1.8.0/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_228',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.8.0/search/groups_1.html b/doc/v1.8.0/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/doc/v1.8.0/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..b6aba910c --- /dev/null +++ b/doc/v1.8.0/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_229',['Library Version',['../group__lib__version.html',1,'']]] +]; 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..03626f64a --- /dev/null +++ b/doc/v1.8.0/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/doc/v1.8.0/search/nomatches.html b/doc/v1.8.0/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/doc/v1.8.0/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/doc/v1.8.0/search/pages_0.html b/doc/v1.8.0/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/doc/v1.8.0/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..76d723197 --- /dev/null +++ b/doc/v1.8.0/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_230',['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..9074198f8 --- /dev/null +++ b/doc/v1.8.0/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/doc/v1.8.0/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.8.0/search/typedefs_0.js b/doc/v1.8.0/search/typedefs_0.js new file mode 100644 index 000000000..5eb8aeb26 --- /dev/null +++ b/doc/v1.8.0/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_206',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_207',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/doc/v1.8.0/search/variables_0.html b/doc/v1.8.0/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/doc/v1.8.0/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.8.0/search/variables_0.js b/doc/v1.8.0/search/variables_0.js new file mode 100644 index 000000000..a54af1600 --- /dev/null +++ b/doc/v1.8.0/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_201',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.8.0/search/variables_1.html b/doc/v1.8.0/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/doc/v1.8.0/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.8.0/search/variables_1.js b/doc/v1.8.0/search/variables_1.js new file mode 100644 index 000000000..739e85e12 --- /dev/null +++ b/doc/v1.8.0/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_202',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.8.0/search/variables_2.html b/doc/v1.8.0/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/doc/v1.8.0/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.8.0/search/variables_2.js b/doc/v1.8.0/search/variables_2.js new file mode 100644 index 000000000..1820b3914 --- /dev/null +++ b/doc/v1.8.0/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_203',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_204',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.8.0/search/variables_3.html b/doc/v1.8.0/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/doc/v1.8.0/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.8.0/search/variables_3.js b/doc/v1.8.0/search/variables_3.js new file mode 100644 index 000000000..6b502f044 --- /dev/null +++ b/doc/v1.8.0/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_205',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.8.0/server_accept.png b/doc/v1.8.0/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/doc/v1.8.0/server_accept.png differ diff --git a/doc/v1.8.0/splitbar.png b/doc/v1.8.0/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/doc/v1.8.0/splitbar.png differ diff --git a/doc/v1.8.0/structxcm__addr__host.html b/doc/v1.8.0/structxcm__addr__host.html new file mode 100644 index 000000000..75e1ba342 --- /dev/null +++ b/doc/v1.8.0/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..f0dba0859 --- /dev/null +++ b/doc/v1.8.0/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/doc/v1.8.0/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/doc/v1.8.0/xcm_8h.html b/doc/v1.8.0/xcm_8h.html new file mode 100644 index 000000000..5750c08bb --- /dev/null +++ b/doc/v1.8.0/xcm_8h.html @@ -0,0 +1,910 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..53414bc10 --- /dev/null +++ b/doc/v1.8.0/xcm_8h_source.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1321 struct xcm_socket;
    +
    1322 
    +
    1375 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1376 
    +
    1398 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1399  const struct xcm_attr_map *attrs);
    +
    1400 
    +
    1436 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1437 
    +
    1453 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1454  const struct xcm_attr_map *attrs);
    +
    1455 
    +
    1472 int xcm_close(struct xcm_socket *socket);
    +
    1473 
    +
    1493 void xcm_cleanup(struct xcm_socket *socket);
    +
    1494 
    +
    1513 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1514 
    +
    1534 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1535  const struct xcm_attr_map *attrs);
    +
    1536 
    +
    1559 int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1560 
    +
    1584 int 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 
    +
    1655 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1656 
    +
    1704 int xcm_fd(struct xcm_socket *socket);
    +
    1705 
    +
    1751 int xcm_finish(struct xcm_socket *socket);
    +
    1752 
    +
    1793 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1794 
    +
    1809 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1810 
    +
    1827 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1828 
    +
    1843 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_server_a(const char *local_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..4131c3b7a --- /dev/null +++ b/doc/v1.8.0/xcm__addr_8h.html @@ -0,0 +1,1070 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..9235ea385 --- /dev/null +++ b/doc/v1.8.0/xcm__addr_8h_source.html @@ -0,0 +1,199 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    44 enum 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];
    +
    63  } addr;
    +
    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 
    +
    93 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94 
    +
    108 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109  uint16_t *port);
    +
    110 
    +
    124 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125  uint16_t *port);
    +
    126 
    +
    141 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142  uint16_t *port);
    +
    143 
    +
    158 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159  uint16_t *port);
    +
    160 
    +
    174 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175 
    +
    189 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190  size_t capacity);
    +
    191 
    +
    205 int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206  uint16_t *port);
    +
    207 
    +
    223 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224  char *utls_addr_s, size_t capacity);
    +
    225 
    +
    241 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242  char *tls_addr_s, size_t capacity);
    +
    243 
    +
    259 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260  char *tcp_addr_s, size_t capacity);
    +
    261 
    +
    277 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278  char *sctp_addr_s, size_t capacity);
    +
    279 
    +
    294 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295 
    +
    310 int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311 
    +
    327 int 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..11ff1e403 --- /dev/null +++ b/doc/v1.8.0/xcm__attr_8h.html @@ -0,0 +1,774 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..6e290cb67 --- /dev/null +++ b/doc/v1.8.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) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_double(struct xcm_socket *socket, const char *name,
    +
    89  double value);
    +
    90 
    +
    103 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    104  const char *value);
    +
    105 
    +
    131 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    132  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    133 
    +
    150 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    151  bool *value);
    +
    152 
    +
    169 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    170  int64_t *value);
    +
    171 
    +
    188 int xcm_attr_get_double(struct xcm_socket *socket, const char *name,
    +
    189  double *value);
    +
    190 
    +
    209 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    210  char *value, size_t capacity);
    +
    211 
    +
    229 int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    230  void *value, size_t capacity);
    +
    231 
    +
    233 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    234  void *value, size_t value_len, void *cb_data);
    +
    235 
    +
    249 void 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..f4b3a807c --- /dev/null +++ b/doc/v1.8.0/xcm__attr__map_8h.html @@ -0,0 +1,985 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..34a82e053 --- /dev/null +++ b/doc/v1.8.0/xcm__attr__map_8h_source.html @@ -0,0 +1,211 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    23 #include <xcm_attr_types.h>
    +
    24 
    +
    25 #include <stdbool.h>
    +
    26 #include <stddef.h>
    +
    27 #include <stdint.h>
    +
    28 
    +
    29 struct xcm_attr_map;
    +
    30 
    +
    31 
    +
    37 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38 
    +
    39 
    +
    47 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48 
    +
    66 void 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 
    +
    80 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81  const char *attr_name, bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name, int64_t attr_value);
    +
    95 
    +
    96 
    +
    106 void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107  const char *attr_name, double attr_value);
    +
    108 
    +
    109 
    +
    119 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120  const char *attr_name, const char *attr_value);
    +
    121 
    +
    122 
    +
    132 void 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 
    +
    146 void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147  const struct xcm_attr_map *src_map);
    +
    148 
    +
    149 
    +
    166 const 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 
    +
    186 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187  const char *attr_name);
    +
    188 
    +
    189 
    +
    204 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205  const char *attr_name);
    +
    206 
    +
    207 
    +
    222 const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223  const char *attr_name);
    +
    224 
    +
    225 
    +
    240 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241  const char *attr_name);
    +
    242 
    +
    257 const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258  const char *attr_name);
    +
    259 
    +
    268 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269  const char *attr_name);
    +
    270 
    +
    271 
    +
    280 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281 
    +
    282 
    +
    290 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291 
    +
    292 
    +
    296 typedef 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 
    +
    315 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316  xcm_attr_map_foreach_cb cb, void *user);
    +
    317 
    +
    318 
    +
    327 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328  const struct xcm_attr_map *attr_map_b);
    +
    329 
    +
    338 void 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)
    +
    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)
    +
    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_bin(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)
    +
    const int64_t * xcm_attr_map_get_int64(const 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..25c1788eb --- /dev/null +++ b/doc/v1.8.0/xcm__attr__types_8h.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..65e0c7872 --- /dev/null +++ b/doc/v1.8.0/xcm__attr__types_8h_source.html @@ -0,0 +1,107 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + + +
    30 };
    +
    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..58d5a55a8 --- /dev/null +++ b/doc/v1.8.0/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..00305566f --- /dev/null +++ b/doc/v1.8.0/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..7427efbfb --- /dev/null +++ b/doc/v1.8.0/xcm__version_8h.html @@ -0,0 +1,266 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..8fce7a4c5 --- /dev/null +++ b/doc/v1.8.0/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    59 unsigned int xcm_version_major(void);
    +
    60 
    +
    67 unsigned int xcm_version_minor(void);
    +
    68 
    +
    74 unsigned int xcm_version_patch(void);
    +
    75 
    +
    84 const char *xcm_version(void);
    +
    85 
    +
    91 unsigned int xcm_version_api_major(void);
    +
    92 
    +
    98 unsigned int xcm_version_api_minor(void);
    +
    99 
    +
    108 const char *xcm_version_api(void);
    +
    109 
    +
    110 #ifdef __cplusplus
    +
    111 }
    +
    112 #endif
    +
    113 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..d17a95629 --- /dev/null +++ b/doc/v1.9.0/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/doc/v1.9.0/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/doc/v1.9.0/bdwn.png differ diff --git a/doc/v1.9.0/classes.html b/doc/v1.9.0/classes.html new file mode 100644 index 000000000..130159a2d --- /dev/null +++ b/doc/v1.9.0/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..281e5d55e --- /dev/null +++ b/doc/v1.9.0/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,103 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    file  xcm_version.h [code]
     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.png b/doc/v1.9.0/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/doc/v1.9.0/doc.png differ diff --git a/doc/v1.9.0/doxygen.css b/doc/v1.9.0/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/doc/v1.9.0/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doc/v1.9.0/doxygen.svg b/doc/v1.9.0/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/doc/v1.9.0/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.9.0/dynsections.js b/doc/v1.9.0/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/doc/v1.9.0/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/doc/v1.9.0/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/doc/v1.9.0/folderclosed.png differ diff --git a/doc/v1.9.0/folderopen.png b/doc/v1.9.0/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/doc/v1.9.0/folderopen.png differ diff --git a/doc/v1.9.0/functions.html b/doc/v1.9.0/functions.html new file mode 100644 index 000000000..11fe91d8f --- /dev/null +++ b/doc/v1.9.0/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..c23df867f --- /dev/null +++ b/doc/v1.9.0/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.9.0/globals.html b/doc/v1.9.0/globals.html new file mode 100644 index 000000000..b4bd27380 --- /dev/null +++ b/doc/v1.9.0/globals.html @@ -0,0 +1,389 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..9f56569b2 --- /dev/null +++ b/doc/v1.9.0/globals_defs.html @@ -0,0 +1,138 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.9.0/globals_enum.html b/doc/v1.9.0/globals_enum.html new file mode 100644 index 000000000..0cb716b46 --- /dev/null +++ b/doc/v1.9.0/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.9.0/globals_eval.html b/doc/v1.9.0/globals_eval.html new file mode 100644 index 000000000..69c65b8ef --- /dev/null +++ b/doc/v1.9.0/globals_eval.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.9.0/globals_func.html b/doc/v1.9.0/globals_func.html new file mode 100644 index 000000000..f4ba14850 --- /dev/null +++ b/doc/v1.9.0/globals_func.html @@ -0,0 +1,299 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - 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..899a41fa2 --- /dev/null +++ b/doc/v1.9.0/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + 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..c44b970ea --- /dev/null +++ b/doc/v1.9.0/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..870ee95ec --- /dev/null +++ b/doc/v1.9.0/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..a5d0a053e --- /dev/null +++ b/doc/v1.9.0/index.html @@ -0,0 +1,705 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/doc/v1.9.0/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/doc/v1.9.0/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/doc/v1.9.0/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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..6a140e8ce --- /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:"Modules",url:"modules.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/modules.html b/doc/v1.9.0/modules.html new file mode 100644 index 000000000..3a6995a0b --- /dev/null +++ b/doc/v1.9.0/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/doc/v1.9.0/nb_connect_and_send.png new file mode 100644 index 000000000..94e1d9d37 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..e1c7e12e8 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..7ab18dc0c 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/doc/v1.9.0/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/doc/v1.9.0/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..869f460ae --- /dev/null +++ b/doc/v1.9.0/search/all_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['api_20version_1',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.9.0/search/all_1.html b/doc/v1.9.0/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/doc/v1.9.0/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..204c38c05 --- /dev/null +++ b/doc/v1.9.0/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_2',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.9.0/search/all_2.html b/doc/v1.9.0/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/doc/v1.9.0/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..d6a623719 --- /dev/null +++ b/doc/v1.9.0/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_3',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.9.0/search/all_3.html b/doc/v1.9.0/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/doc/v1.9.0/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..e908022ab --- /dev/null +++ b/doc/v1.9.0/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_4',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_5',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.9.0/search/all_4.html b/doc/v1.9.0/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/doc/v1.9.0/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..6d0e67254 --- /dev/null +++ b/doc/v1.9.0/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_6',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.9.0/search/all_5.html b/doc/v1.9.0/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/doc/v1.9.0/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..4f4fb05a9 --- /dev/null +++ b/doc/v1.9.0/search/all_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_7',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.9.0/search/all_6.html b/doc/v1.9.0/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/doc/v1.9.0/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..6f8a0941a --- /dev/null +++ b/doc/v1.9.0/search/all_6.js @@ -0,0 +1,117 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtcp_14',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_15',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_16',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_17',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_18',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_19',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_20',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_21',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_22',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_23',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_24',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_25',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_26',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_27',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_28',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_29',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_30',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_31',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_32',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_33',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_34',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_35',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_36',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_37',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_38',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_39',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_40',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_41',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_42',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_43',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_44',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_45',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_46',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_47',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_48',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_49',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_50',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_51',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_52',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_53',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_54',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_55',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_56',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_57',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_58',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_59',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_60',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_61',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_62',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_63',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_64',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_65',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_66',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_67',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_68',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_69',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_70',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_71',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_72',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_73',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_74',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_75',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtcp_5fproto_76',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_77',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_78',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_79',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_80',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_81',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_82',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_83',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_84',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_85',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_86',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_87',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_88',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_89',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_90',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_91',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_92',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_93',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_94',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_95',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_96',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_97',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_98',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_99',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_100',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_101',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_102',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_103',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_104',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_105',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_106',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_107',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_108',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_109',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_110',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_111',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_112',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_113',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_114',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_115',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_116',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_117',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_118',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_119',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_120',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_121',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.9.0/search/classes_0.html b/doc/v1.9.0/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/doc/v1.9.0/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..46c72b27b --- /dev/null +++ b/doc/v1.9.0/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_122',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_123',['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..a933eea1a --- /dev/null +++ b/doc/v1.9.0/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/doc/v1.9.0/search/defines_0.html b/doc/v1.9.0/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/doc/v1.9.0/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..389129bd6 --- /dev/null +++ b/doc/v1.9.0/search/defines_0.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['xcm_5fbtcp_5fproto_219',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_220',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_221',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_222',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_223',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_224',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_225',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_226',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_227',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_228',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_229',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_230',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_231',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_232',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_233',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.9.0/search/enums_0.html b/doc/v1.9.0/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/doc/v1.9.0/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..03d67d05f --- /dev/null +++ b/doc/v1.9.0/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_213',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.9.0/search/enumvalues_0.html b/doc/v1.9.0/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/doc/v1.9.0/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..53a864a29 --- /dev/null +++ b/doc/v1.9.0/search/enumvalues_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_214',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_215',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_216',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_217',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_218',['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.html b/doc/v1.9.0/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/doc/v1.9.0/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..339f551ed --- /dev/null +++ b/doc/v1.9.0/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_124',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_125',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_126',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_127',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_128',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_129',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_130',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/doc/v1.9.0/search/functions_0.html b/doc/v1.9.0/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/doc/v1.9.0/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5e38d5ab8 --- /dev/null +++ b/doc/v1.9.0/search/functions_0.js @@ -0,0 +1,78 @@ +var searchData= +[ + ['xcm_5faccept_131',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_132',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtcp_133',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_134',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_135',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_136',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_137',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_138',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_139',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_140',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_141',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_142',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_143',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_144',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_145',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_146',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_147',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_148',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_149',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_150',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_151',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_152',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_153',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_154',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_155',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_156',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_157',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_158',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_159',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_160',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_161',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_162',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_163',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_164',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_165',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_166',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_167',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_168',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_169',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_170',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_171',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_172',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_173',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_174',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_175',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_176',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_177',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_178',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_179',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_180',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_181',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_182',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_183',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_184',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_185',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_186',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_187',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_188',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_189',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_190',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_191',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_192',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_193',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_194',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_195',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_196',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_197',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_198',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_199',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_200',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_201',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_202',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_203',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_204',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_205',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.9.0/search/groups_0.html b/doc/v1.9.0/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/doc/v1.9.0/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..7c795c8d6 --- /dev/null +++ b/doc/v1.9.0/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_234',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.9.0/search/groups_1.html b/doc/v1.9.0/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/doc/v1.9.0/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..bdfe1de90 --- /dev/null +++ b/doc/v1.9.0/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_235',['Library Version',['../group__lib__version.html',1,'']]] +]; 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..03626f64a --- /dev/null +++ b/doc/v1.9.0/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/doc/v1.9.0/search/nomatches.html b/doc/v1.9.0/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/doc/v1.9.0/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/doc/v1.9.0/search/pages_0.html b/doc/v1.9.0/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/doc/v1.9.0/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..04b117677 --- /dev/null +++ b/doc/v1.9.0/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_236',['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..9074198f8 --- /dev/null +++ b/doc/v1.9.0/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/doc/v1.9.0/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.9.0/search/typedefs_0.js b/doc/v1.9.0/search/typedefs_0.js new file mode 100644 index 000000000..448720ea0 --- /dev/null +++ b/doc/v1.9.0/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_211',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_212',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/doc/v1.9.0/search/variables_0.html b/doc/v1.9.0/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/doc/v1.9.0/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.9.0/search/variables_0.js b/doc/v1.9.0/search/variables_0.js new file mode 100644 index 000000000..7b6435276 --- /dev/null +++ b/doc/v1.9.0/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_206',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.9.0/search/variables_1.html b/doc/v1.9.0/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/doc/v1.9.0/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.9.0/search/variables_1.js b/doc/v1.9.0/search/variables_1.js new file mode 100644 index 000000000..bf7bf9f9e --- /dev/null +++ b/doc/v1.9.0/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_207',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.9.0/search/variables_2.html b/doc/v1.9.0/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/doc/v1.9.0/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.9.0/search/variables_2.js b/doc/v1.9.0/search/variables_2.js new file mode 100644 index 000000000..08ecaf1cb --- /dev/null +++ b/doc/v1.9.0/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_208',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_209',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.9.0/search/variables_3.html b/doc/v1.9.0/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/doc/v1.9.0/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.9.0/search/variables_3.js b/doc/v1.9.0/search/variables_3.js new file mode 100644 index 000000000..df64ea794 --- /dev/null +++ b/doc/v1.9.0/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_210',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.9.0/server_accept.png b/doc/v1.9.0/server_accept.png new file mode 100644 index 000000000..7406e6cc3 Binary files /dev/null and b/doc/v1.9.0/server_accept.png differ diff --git a/doc/v1.9.0/splitbar.png b/doc/v1.9.0/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/doc/v1.9.0/splitbar.png differ diff --git a/doc/v1.9.0/structxcm__addr__host.html b/doc/v1.9.0/structxcm__addr__host.html new file mode 100644 index 000000000..6f6023ca8 --- /dev/null +++ b/doc/v1.9.0/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..35da48f81 --- /dev/null +++ b/doc/v1.9.0/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/doc/v1.9.0/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/doc/v1.9.0/xcm_8h.html b/doc/v1.9.0/xcm_8h.html new file mode 100644 index 000000000..faaed1893 --- /dev/null +++ b/doc/v1.9.0/xcm_8h.html @@ -0,0 +1,910 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..0470bcb95 --- /dev/null +++ b/doc/v1.9.0/xcm_8h_source.html @@ -0,0 +1,167 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1437 struct xcm_socket;
    +
    1438 
    +
    1491 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1492 
    +
    1514 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1515  const struct xcm_attr_map *attrs);
    +
    1516 
    +
    1552 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1553 
    +
    1569 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1570  const struct xcm_attr_map *attrs);
    +
    1571 
    +
    1588 int xcm_close(struct xcm_socket *socket);
    +
    1589 
    +
    1609 void xcm_cleanup(struct xcm_socket *socket);
    +
    1610 
    +
    1629 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1630 
    +
    1650 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1651  const struct xcm_attr_map *attrs);
    +
    1652 
    +
    1675 int xcm_send(struct xcm_socket *__restrict conn_socket,
    +
    1676  const void *__restrict buf, size_t len);
    +
    1677 
    +
    1701 int 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 
    +
    1773 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1774 
    +
    1822 int xcm_fd(struct xcm_socket *socket);
    +
    1823 
    +
    1869 int xcm_finish(struct xcm_socket *socket);
    +
    1870 
    +
    1911 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1912 
    +
    1927 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1928 
    +
    1945 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1946 
    +
    1961 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    int xcm_receive(struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    int xcm_send(struct xcm_socket *__restrict conn_socket, const void *__restrict 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_server_a(const char *local_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.9.0/xcm__addr_8h.html b/doc/v1.9.0/xcm__addr_8h.html new file mode 100644 index 000000000..652360893 --- /dev/null +++ b/doc/v1.9.0/xcm__addr_8h.html @@ -0,0 +1,1200 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..d555f6c66 --- /dev/null +++ b/doc/v1.9.0/xcm__addr_8h_source.html @@ -0,0 +1,208 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    46 enum 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];
    +
    65  } addr;
    +
    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 
    +
    95 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    96 
    +
    110 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    111  uint16_t *port);
    +
    112 
    +
    126 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    127  uint16_t *port);
    +
    128 
    +
    143 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    144  uint16_t *port);
    +
    145 
    +
    160 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    161  uint16_t *port);
    +
    162 
    +
    176 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    177 
    +
    191 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    192  size_t capacity);
    +
    193 
    +
    207 int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host,
    +
    208  uint16_t *port);
    +
    209 
    +
    223 int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    224  uint16_t *port);
    +
    225 
    +
    241 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    242  char *utls_addr_s, size_t capacity);
    +
    243 
    +
    259 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    260  char *tls_addr_s, size_t capacity);
    +
    261 
    +
    277 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    278  char *tcp_addr_s, size_t capacity);
    +
    279 
    +
    295 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    296  char *sctp_addr_s, size_t capacity);
    +
    297 
    +
    312 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    313 
    +
    328 int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    329 
    +
    345 int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port,
    +
    346  char *btcp_addr_s, size_t capacity);
    +
    347 
    +
    363 int 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..39f162ab6 --- /dev/null +++ b/doc/v1.9.0/xcm__attr_8h.html @@ -0,0 +1,774 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..25e24cd5d --- /dev/null +++ b/doc/v1.9.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) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_double(struct xcm_socket *socket, const char *name,
    +
    89  double value);
    +
    90 
    +
    103 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    104  const char *value);
    +
    105 
    +
    131 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    132  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    133 
    +
    150 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    151  bool *value);
    +
    152 
    +
    169 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    170  int64_t *value);
    +
    171 
    +
    188 int xcm_attr_get_double(struct xcm_socket *socket, const char *name,
    +
    189  double *value);
    +
    190 
    +
    209 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    210  char *value, size_t capacity);
    +
    211 
    +
    229 int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    230  void *value, size_t capacity);
    +
    231 
    +
    233 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    234  void *value, size_t value_len, void *cb_data);
    +
    235 
    +
    249 void 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..9456667ec --- /dev/null +++ b/doc/v1.9.0/xcm__attr__map_8h.html @@ -0,0 +1,985 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..22212046a --- /dev/null +++ b/doc/v1.9.0/xcm__attr__map_8h_source.html @@ -0,0 +1,211 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    23 #include <xcm_attr_types.h>
    +
    24 
    +
    25 #include <stdbool.h>
    +
    26 #include <stddef.h>
    +
    27 #include <stdint.h>
    +
    28 
    +
    29 struct xcm_attr_map;
    +
    30 
    +
    31 
    +
    37 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38 
    +
    39 
    +
    47 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48 
    +
    66 void 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 
    +
    80 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81  const char *attr_name, bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name, int64_t attr_value);
    +
    95 
    +
    96 
    +
    106 void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107  const char *attr_name, double attr_value);
    +
    108 
    +
    109 
    +
    119 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120  const char *attr_name, const char *attr_value);
    +
    121 
    +
    122 
    +
    132 void 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 
    +
    146 void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147  const struct xcm_attr_map *src_map);
    +
    148 
    +
    149 
    +
    166 const 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 
    +
    186 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187  const char *attr_name);
    +
    188 
    +
    189 
    +
    204 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205  const char *attr_name);
    +
    206 
    +
    207 
    +
    222 const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223  const char *attr_name);
    +
    224 
    +
    225 
    +
    240 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241  const char *attr_name);
    +
    242 
    +
    257 const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258  const char *attr_name);
    +
    259 
    +
    268 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269  const char *attr_name);
    +
    270 
    +
    271 
    +
    280 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281 
    +
    282 
    +
    290 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291 
    +
    292 
    +
    296 typedef 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 
    +
    315 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316  xcm_attr_map_foreach_cb cb, void *user);
    +
    317 
    +
    318 
    +
    327 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328  const struct xcm_attr_map *attr_map_b);
    +
    329 
    +
    338 void 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)
    +
    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)
    +
    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_bin(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)
    +
    const int64_t * xcm_attr_map_get_int64(const 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..e3c2003a2 --- /dev/null +++ b/doc/v1.9.0/xcm__attr__types_8h.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..a99ff11b5 --- /dev/null +++ b/doc/v1.9.0/xcm__attr__types_8h_source.html @@ -0,0 +1,107 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + + +
    30 };
    +
    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..5dc618b13 --- /dev/null +++ b/doc/v1.9.0/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..706819175 --- /dev/null +++ b/doc/v1.9.0/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..358c98a59 --- /dev/null +++ b/doc/v1.9.0/xcm__version_8h.html @@ -0,0 +1,266 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..93898cb64 --- /dev/null +++ b/doc/v1.9.0/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    59 unsigned int xcm_version_major(void);
    +
    60 
    +
    67 unsigned int xcm_version_minor(void);
    +
    68 
    +
    74 unsigned int xcm_version_patch(void);
    +
    75 
    +
    84 const char *xcm_version(void);
    +
    85 
    +
    91 unsigned int xcm_version_api_major(void);
    +
    92 
    +
    98 unsigned int xcm_version_api_minor(void);
    +
    99 
    +
    108 const char *xcm_version_api(void);
    +
    109 
    +
    110 #ifdef __cplusplus
    +
    111 }
    +
    112 #endif
    +
    113 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..589a0a773 --- /dev/null +++ b/doc/v1.9.1/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/doc/v1.9.1/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/doc/v1.9.1/bdwn.png differ diff --git a/doc/v1.9.1/classes.html b/doc/v1.9.1/classes.html new file mode 100644 index 000000000..53b93bb16 --- /dev/null +++ b/doc/v1.9.1/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..c37424989 --- /dev/null +++ b/doc/v1.9.1/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,103 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    file  xcm_version.h [code]
     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.png b/doc/v1.9.1/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/doc/v1.9.1/doc.png differ diff --git a/doc/v1.9.1/doxygen.css b/doc/v1.9.1/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/doc/v1.9.1/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doc/v1.9.1/doxygen.svg b/doc/v1.9.1/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/doc/v1.9.1/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.9.1/dynsections.js b/doc/v1.9.1/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/doc/v1.9.1/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/doc/v1.9.1/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/doc/v1.9.1/folderclosed.png differ diff --git a/doc/v1.9.1/folderopen.png b/doc/v1.9.1/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/doc/v1.9.1/folderopen.png differ diff --git a/doc/v1.9.1/functions.html b/doc/v1.9.1/functions.html new file mode 100644 index 000000000..45aa59c35 --- /dev/null +++ b/doc/v1.9.1/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..06853da99 --- /dev/null +++ b/doc/v1.9.1/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.9.1/globals.html b/doc/v1.9.1/globals.html new file mode 100644 index 000000000..4c1e2d558 --- /dev/null +++ b/doc/v1.9.1/globals.html @@ -0,0 +1,389 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..1092b53ef --- /dev/null +++ b/doc/v1.9.1/globals_defs.html @@ -0,0 +1,138 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.9.1/globals_enum.html b/doc/v1.9.1/globals_enum.html new file mode 100644 index 000000000..bfb78d449 --- /dev/null +++ b/doc/v1.9.1/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.9.1/globals_eval.html b/doc/v1.9.1/globals_eval.html new file mode 100644 index 000000000..07701b2d5 --- /dev/null +++ b/doc/v1.9.1/globals_eval.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.9.1/globals_func.html b/doc/v1.9.1/globals_func.html new file mode 100644 index 000000000..1f7abf6bb --- /dev/null +++ b/doc/v1.9.1/globals_func.html @@ -0,0 +1,299 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - 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..3b92eb33c --- /dev/null +++ b/doc/v1.9.1/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + 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..ba2e0a1e6 --- /dev/null +++ b/doc/v1.9.1/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..0197af063 --- /dev/null +++ b/doc/v1.9.1/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..862ca5822 --- /dev/null +++ b/doc/v1.9.1/index.html @@ -0,0 +1,710 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/doc/v1.9.1/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/doc/v1.9.1/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/doc/v1.9.1/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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..6a140e8ce --- /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:"Modules",url:"modules.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/modules.html b/doc/v1.9.1/modules.html new file mode 100644 index 000000000..fb883e62d --- /dev/null +++ b/doc/v1.9.1/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/doc/v1.9.1/nb_connect_and_send.png new file mode 100644 index 000000000..2bfaec2e1 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..4ce56aa7b 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..b29bdce34 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/doc/v1.9.1/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/doc/v1.9.1/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..869f460ae --- /dev/null +++ b/doc/v1.9.1/search/all_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['api_20version_1',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.9.1/search/all_1.html b/doc/v1.9.1/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/doc/v1.9.1/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..204c38c05 --- /dev/null +++ b/doc/v1.9.1/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_2',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.9.1/search/all_2.html b/doc/v1.9.1/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/doc/v1.9.1/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..d6a623719 --- /dev/null +++ b/doc/v1.9.1/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_3',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.9.1/search/all_3.html b/doc/v1.9.1/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/doc/v1.9.1/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..e908022ab --- /dev/null +++ b/doc/v1.9.1/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_4',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_5',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.9.1/search/all_4.html b/doc/v1.9.1/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/doc/v1.9.1/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..6d0e67254 --- /dev/null +++ b/doc/v1.9.1/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_6',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.9.1/search/all_5.html b/doc/v1.9.1/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/doc/v1.9.1/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..4f4fb05a9 --- /dev/null +++ b/doc/v1.9.1/search/all_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_7',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.9.1/search/all_6.html b/doc/v1.9.1/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/doc/v1.9.1/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..6f8a0941a --- /dev/null +++ b/doc/v1.9.1/search/all_6.js @@ -0,0 +1,117 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtcp_14',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_15',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_16',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_17',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_18',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_19',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_20',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_21',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_22',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_23',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_24',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_25',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_26',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_27',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_28',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_29',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_30',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_31',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_32',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_33',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_34',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_35',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_36',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_37',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_38',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_39',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_40',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_41',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_42',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_43',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_44',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_45',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_46',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_47',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_48',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_49',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_50',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_51',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_52',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_53',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_54',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_55',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_56',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_57',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_58',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_59',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_60',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_61',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_62',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_63',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_64',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_65',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_66',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_67',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_68',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_69',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_70',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_71',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_72',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_73',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_74',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_75',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtcp_5fproto_76',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_77',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_78',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_79',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_80',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_81',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_82',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_83',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_84',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_85',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_86',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_87',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_88',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_89',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_90',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_91',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_92',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_93',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_94',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_95',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_96',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_97',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_98',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_99',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_100',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_101',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_102',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_103',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_104',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_105',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_106',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_107',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_108',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_109',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_110',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_111',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_112',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_113',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_114',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_115',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_116',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_117',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_118',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_119',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_120',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_121',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.9.1/search/classes_0.html b/doc/v1.9.1/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/doc/v1.9.1/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..46c72b27b --- /dev/null +++ b/doc/v1.9.1/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_122',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_123',['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..a933eea1a --- /dev/null +++ b/doc/v1.9.1/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/doc/v1.9.1/search/defines_0.html b/doc/v1.9.1/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/doc/v1.9.1/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..389129bd6 --- /dev/null +++ b/doc/v1.9.1/search/defines_0.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['xcm_5fbtcp_5fproto_219',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_220',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_221',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_222',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_223',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_224',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_225',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_226',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_227',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_228',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_229',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_230',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_231',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_232',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_233',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.9.1/search/enums_0.html b/doc/v1.9.1/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/doc/v1.9.1/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..03d67d05f --- /dev/null +++ b/doc/v1.9.1/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_213',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.9.1/search/enumvalues_0.html b/doc/v1.9.1/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/doc/v1.9.1/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..53a864a29 --- /dev/null +++ b/doc/v1.9.1/search/enumvalues_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_214',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_215',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_216',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_217',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_218',['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.html b/doc/v1.9.1/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/doc/v1.9.1/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..339f551ed --- /dev/null +++ b/doc/v1.9.1/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_124',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_125',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_126',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_127',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_128',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_129',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_130',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/doc/v1.9.1/search/functions_0.html b/doc/v1.9.1/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/doc/v1.9.1/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5e38d5ab8 --- /dev/null +++ b/doc/v1.9.1/search/functions_0.js @@ -0,0 +1,78 @@ +var searchData= +[ + ['xcm_5faccept_131',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_132',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtcp_133',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_134',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_135',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_136',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_137',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_138',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_139',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_140',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_141',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_142',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_143',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_144',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_145',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_146',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_147',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_148',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_149',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_150',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_151',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_152',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_153',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_154',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_155',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_156',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_157',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_158',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_159',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_160',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_161',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_162',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_163',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_164',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_165',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_166',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_167',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_168',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_169',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_170',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_171',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_172',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_173',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_174',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_175',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_176',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_177',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_178',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_179',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_180',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_181',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_182',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_183',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_184',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_185',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_186',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_187',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_188',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_189',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_190',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_191',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_192',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_193',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_194',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_195',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_196',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_197',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_198',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_199',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_200',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_201',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_202',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_203',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_204',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_205',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.9.1/search/groups_0.html b/doc/v1.9.1/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/doc/v1.9.1/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..7c795c8d6 --- /dev/null +++ b/doc/v1.9.1/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_234',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.9.1/search/groups_1.html b/doc/v1.9.1/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/doc/v1.9.1/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..bdfe1de90 --- /dev/null +++ b/doc/v1.9.1/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_235',['Library Version',['../group__lib__version.html',1,'']]] +]; 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..03626f64a --- /dev/null +++ b/doc/v1.9.1/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/doc/v1.9.1/search/nomatches.html b/doc/v1.9.1/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/doc/v1.9.1/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/doc/v1.9.1/search/pages_0.html b/doc/v1.9.1/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/doc/v1.9.1/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..04b117677 --- /dev/null +++ b/doc/v1.9.1/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_236',['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..9074198f8 --- /dev/null +++ b/doc/v1.9.1/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/doc/v1.9.1/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.9.1/search/typedefs_0.js b/doc/v1.9.1/search/typedefs_0.js new file mode 100644 index 000000000..448720ea0 --- /dev/null +++ b/doc/v1.9.1/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_211',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_212',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/doc/v1.9.1/search/variables_0.html b/doc/v1.9.1/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/doc/v1.9.1/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.9.1/search/variables_0.js b/doc/v1.9.1/search/variables_0.js new file mode 100644 index 000000000..7b6435276 --- /dev/null +++ b/doc/v1.9.1/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_206',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.9.1/search/variables_1.html b/doc/v1.9.1/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/doc/v1.9.1/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.9.1/search/variables_1.js b/doc/v1.9.1/search/variables_1.js new file mode 100644 index 000000000..bf7bf9f9e --- /dev/null +++ b/doc/v1.9.1/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_207',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.9.1/search/variables_2.html b/doc/v1.9.1/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/doc/v1.9.1/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.9.1/search/variables_2.js b/doc/v1.9.1/search/variables_2.js new file mode 100644 index 000000000..08ecaf1cb --- /dev/null +++ b/doc/v1.9.1/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_208',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_209',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.9.1/search/variables_3.html b/doc/v1.9.1/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/doc/v1.9.1/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.9.1/search/variables_3.js b/doc/v1.9.1/search/variables_3.js new file mode 100644 index 000000000..df64ea794 --- /dev/null +++ b/doc/v1.9.1/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_210',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.9.1/server_accept.png b/doc/v1.9.1/server_accept.png new file mode 100644 index 000000000..f1ae8ad49 Binary files /dev/null and b/doc/v1.9.1/server_accept.png differ diff --git a/doc/v1.9.1/splitbar.png b/doc/v1.9.1/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/doc/v1.9.1/splitbar.png differ diff --git a/doc/v1.9.1/structxcm__addr__host.html b/doc/v1.9.1/structxcm__addr__host.html new file mode 100644 index 000000000..8f4426a65 --- /dev/null +++ b/doc/v1.9.1/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..2fc3c2d58 --- /dev/null +++ b/doc/v1.9.1/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/doc/v1.9.1/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/doc/v1.9.1/xcm_8h.html b/doc/v1.9.1/xcm_8h.html new file mode 100644 index 000000000..0b29ffdd5 --- /dev/null +++ b/doc/v1.9.1/xcm_8h.html @@ -0,0 +1,910 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..c1129d054 --- /dev/null +++ b/doc/v1.9.1/xcm_8h_source.html @@ -0,0 +1,167 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1458 struct xcm_socket;
    +
    1459 
    +
    1512 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1513 
    +
    1535 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1536  const struct xcm_attr_map *attrs);
    +
    1537 
    +
    1573 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1574 
    +
    1590 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1591  const struct xcm_attr_map *attrs);
    +
    1592 
    +
    1609 int xcm_close(struct xcm_socket *socket);
    +
    1610 
    +
    1630 void xcm_cleanup(struct xcm_socket *socket);
    +
    1631 
    +
    1650 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1651 
    +
    1671 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1672  const struct xcm_attr_map *attrs);
    +
    1673 
    +
    1696 int xcm_send(struct xcm_socket *__restrict conn_socket,
    +
    1697  const void *__restrict buf, size_t len);
    +
    1698 
    +
    1722 int 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 
    +
    1794 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1795 
    +
    1843 int xcm_fd(struct xcm_socket *socket);
    +
    1844 
    +
    1890 int xcm_finish(struct xcm_socket *socket);
    +
    1891 
    +
    1932 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1933 
    +
    1948 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1949 
    +
    1966 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1967 
    +
    1982 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    int xcm_receive(struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    int xcm_send(struct xcm_socket *__restrict conn_socket, const void *__restrict 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_server_a(const char *local_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.9.1/xcm__addr_8h.html b/doc/v1.9.1/xcm__addr_8h.html new file mode 100644 index 000000000..9cf33ecdc --- /dev/null +++ b/doc/v1.9.1/xcm__addr_8h.html @@ -0,0 +1,1200 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..1ad39dc1c --- /dev/null +++ b/doc/v1.9.1/xcm__addr_8h_source.html @@ -0,0 +1,208 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    46 enum 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];
    +
    65  } addr;
    +
    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 
    +
    95 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    96 
    +
    110 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    111  uint16_t *port);
    +
    112 
    +
    126 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    127  uint16_t *port);
    +
    128 
    +
    143 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    144  uint16_t *port);
    +
    145 
    +
    160 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    161  uint16_t *port);
    +
    162 
    +
    176 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    177 
    +
    191 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    192  size_t capacity);
    +
    193 
    +
    207 int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host,
    +
    208  uint16_t *port);
    +
    209 
    +
    223 int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    224  uint16_t *port);
    +
    225 
    +
    241 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    242  char *utls_addr_s, size_t capacity);
    +
    243 
    +
    259 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    260  char *tls_addr_s, size_t capacity);
    +
    261 
    +
    277 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    278  char *tcp_addr_s, size_t capacity);
    +
    279 
    +
    295 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    296  char *sctp_addr_s, size_t capacity);
    +
    297 
    +
    312 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    313 
    +
    328 int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    329 
    +
    345 int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port,
    +
    346  char *btcp_addr_s, size_t capacity);
    +
    347 
    +
    363 int 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..da20b9f66 --- /dev/null +++ b/doc/v1.9.1/xcm__attr_8h.html @@ -0,0 +1,774 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..299b1adfe --- /dev/null +++ b/doc/v1.9.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) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_double(struct xcm_socket *socket, const char *name,
    +
    89  double value);
    +
    90 
    +
    103 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    104  const char *value);
    +
    105 
    +
    131 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    132  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    133 
    +
    150 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    151  bool *value);
    +
    152 
    +
    169 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    170  int64_t *value);
    +
    171 
    +
    188 int xcm_attr_get_double(struct xcm_socket *socket, const char *name,
    +
    189  double *value);
    +
    190 
    +
    209 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    210  char *value, size_t capacity);
    +
    211 
    +
    229 int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    230  void *value, size_t capacity);
    +
    231 
    +
    233 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    234  void *value, size_t value_len, void *cb_data);
    +
    235 
    +
    249 void 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..3a27559f4 --- /dev/null +++ b/doc/v1.9.1/xcm__attr__map_8h.html @@ -0,0 +1,985 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..7c5f04221 --- /dev/null +++ b/doc/v1.9.1/xcm__attr__map_8h_source.html @@ -0,0 +1,211 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    23 #include <xcm_attr_types.h>
    +
    24 
    +
    25 #include <stdbool.h>
    +
    26 #include <stddef.h>
    +
    27 #include <stdint.h>
    +
    28 
    +
    29 struct xcm_attr_map;
    +
    30 
    +
    31 
    +
    37 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38 
    +
    39 
    +
    47 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48 
    +
    66 void 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 
    +
    80 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81  const char *attr_name, bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name, int64_t attr_value);
    +
    95 
    +
    96 
    +
    106 void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107  const char *attr_name, double attr_value);
    +
    108 
    +
    109 
    +
    119 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120  const char *attr_name, const char *attr_value);
    +
    121 
    +
    122 
    +
    132 void 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 
    +
    146 void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147  const struct xcm_attr_map *src_map);
    +
    148 
    +
    149 
    +
    166 const 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 
    +
    186 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187  const char *attr_name);
    +
    188 
    +
    189 
    +
    204 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205  const char *attr_name);
    +
    206 
    +
    207 
    +
    222 const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223  const char *attr_name);
    +
    224 
    +
    225 
    +
    240 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241  const char *attr_name);
    +
    242 
    +
    257 const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258  const char *attr_name);
    +
    259 
    +
    268 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269  const char *attr_name);
    +
    270 
    +
    271 
    +
    280 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281 
    +
    282 
    +
    290 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291 
    +
    292 
    +
    296 typedef 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 
    +
    315 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316  xcm_attr_map_foreach_cb cb, void *user);
    +
    317 
    +
    318 
    +
    327 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328  const struct xcm_attr_map *attr_map_b);
    +
    329 
    +
    338 void 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)
    +
    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)
    +
    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_bin(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)
    +
    const int64_t * xcm_attr_map_get_int64(const 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..a20ac29bc --- /dev/null +++ b/doc/v1.9.1/xcm__attr__types_8h.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..d98197352 --- /dev/null +++ b/doc/v1.9.1/xcm__attr__types_8h_source.html @@ -0,0 +1,107 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + + +
    30 };
    +
    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..e712d57c5 --- /dev/null +++ b/doc/v1.9.1/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..9c642fce3 --- /dev/null +++ b/doc/v1.9.1/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..e48ca5ea2 --- /dev/null +++ b/doc/v1.9.1/xcm__version_8h.html @@ -0,0 +1,266 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..d65f66895 --- /dev/null +++ b/doc/v1.9.1/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    59 unsigned int xcm_version_major(void);
    +
    60 
    +
    67 unsigned int xcm_version_minor(void);
    +
    68 
    +
    74 unsigned int xcm_version_patch(void);
    +
    75 
    +
    84 const char *xcm_version(void);
    +
    85 
    +
    91 unsigned int xcm_version_api_major(void);
    +
    92 
    +
    98 unsigned int xcm_version_api_minor(void);
    +
    99 
    +
    108 const char *xcm_version_api(void);
    +
    109 
    +
    110 #ifdef __cplusplus
    +
    111 }
    +
    112 #endif
    +
    113 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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..09b935c5f --- /dev/null +++ b/doc/v1.9.2/annotated.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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/bdwn.png b/doc/v1.9.2/bdwn.png new file mode 100644 index 000000000..940a0b950 Binary files /dev/null and b/doc/v1.9.2/bdwn.png differ diff --git a/doc/v1.9.2/classes.html b/doc/v1.9.2/classes.html new file mode 100644 index 000000000..0d75e2319 --- /dev/null +++ b/doc/v1.9.2/classes.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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..14f64dd39 --- /dev/null +++ b/doc/v1.9.2/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,103 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  xcm.h [code]
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
    file  xcm_addr.h [code]
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
    file  xcm_attr.h [code]
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
    file  xcm_attr_map.h [code]
     This file contains the XCM attribute map API.
     
    file  xcm_attr_types.h [code]
     This file contains type definitions for the XCM attribute access API.
     
    file  xcm_compat.h [code]
     This file contains obsolete parts of the XCM core API.
     
    file  xcm_version.h [code]
     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.png b/doc/v1.9.2/doc.png new file mode 100644 index 000000000..17edabff9 Binary files /dev/null and b/doc/v1.9.2/doc.png differ diff --git a/doc/v1.9.2/doxygen.css b/doc/v1.9.2/doxygen.css new file mode 100644 index 000000000..ffbff0224 --- /dev/null +++ b/doc/v1.9.2/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + 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 cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +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 { + border-right: 1px solid #A3B4D7; + 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: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.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.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#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 #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + 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: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.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.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +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 { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +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; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +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: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.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 cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* 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: #602020; + 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: "courier new",courier,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: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + 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 #9CAFD4; + border-bottom: 1px solid #9CAFD4; + 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.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.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: #3D578C; +} + +.arrow { + color: #9CAFD4; + -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: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + 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:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @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: #2A3D61; +} + +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 #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + 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 #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.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:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.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:#364D7C; + 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:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +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.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 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.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + 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: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + 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: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +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; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + 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; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + 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: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + 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: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + 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 #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + 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 +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doc/v1.9.2/doxygen.svg b/doc/v1.9.2/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/doc/v1.9.2/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.9.2/dynsections.js b/doc/v1.9.2/dynsections.js new file mode 100644 index 000000000..3174bd7be --- /dev/null +++ b/doc/v1.9.2/dynsections.js @@ -0,0 +1,121 @@ +/* + @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'); +} + +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 + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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.png b/doc/v1.9.2/folderclosed.png new file mode 100644 index 000000000..bb8ab35ed Binary files /dev/null and b/doc/v1.9.2/folderclosed.png differ diff --git a/doc/v1.9.2/folderopen.png b/doc/v1.9.2/folderopen.png new file mode 100644 index 000000000..d6c7f676a Binary files /dev/null and b/doc/v1.9.2/folderopen.png differ diff --git a/doc/v1.9.2/functions.html b/doc/v1.9.2/functions.html new file mode 100644 index 000000000..bccc923c9 --- /dev/null +++ b/doc/v1.9.2/functions.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..b08ffbc4f --- /dev/null +++ b/doc/v1.9.2/functions_vars.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.9.2/globals.html b/doc/v1.9.2/globals.html new file mode 100644 index 000000000..fac5d0d59 --- /dev/null +++ b/doc/v1.9.2/globals.html @@ -0,0 +1,389 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    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..2358d6d5a --- /dev/null +++ b/doc/v1.9.2/globals_defs.html @@ -0,0 +1,138 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.9.2/globals_enum.html b/doc/v1.9.2/globals_enum.html new file mode 100644 index 000000000..315257a81 --- /dev/null +++ b/doc/v1.9.2/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.9.2/globals_eval.html b/doc/v1.9.2/globals_eval.html new file mode 100644 index 000000000..ea093923f --- /dev/null +++ b/doc/v1.9.2/globals_eval.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/doc/v1.9.2/globals_func.html b/doc/v1.9.2/globals_func.html new file mode 100644 index 000000000..e113e7ed1 --- /dev/null +++ b/doc/v1.9.2/globals_func.html @@ -0,0 +1,299 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - 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..13ad0f8c3 --- /dev/null +++ b/doc/v1.9.2/globals_type.html @@ -0,0 +1,78 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + 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..be59db949 --- /dev/null +++ b/doc/v1.9.2/group__api__version.html @@ -0,0 +1,133 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..05929ff8f --- /dev/null +++ b/doc/v1.9.2/group__lib__version.html @@ -0,0 +1,150 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    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..aa175bea4 --- /dev/null +++ b/doc/v1.9.2/index.html @@ -0,0 +1,711 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    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)
    +
    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)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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/jquery.js b/doc/v1.9.2/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/doc/v1.9.2/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS 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=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,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},x=function(e){return null!=e&&e===e.window},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.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(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($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),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-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|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(m.childNodes),m.childNodes),t[m.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&&((e?e.ownerDocument||e:m)!==C&&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&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$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[k]=!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.namespaceURI,n=(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:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),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=k,!C.getElementsByName||!C.getElementsByName(k).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){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),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("!=",$)}),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},D=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===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,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]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[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){A(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=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(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)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.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 k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.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(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(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,ge={option:[1,""],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)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").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 Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.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(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.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?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.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=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.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,k.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)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.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"===k.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"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.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)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.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?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.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){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},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;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({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,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),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(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(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),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".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=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),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,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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")];4>e;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;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),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:++i.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,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,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}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=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..2fe2214f2 --- /dev/null +++ b/doc/v1.9.2/menu.js @@ -0,0 +1,51 @@ +/* + @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+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#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..6a140e8ce --- /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:"Modules",url:"modules.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/modules.html b/doc/v1.9.2/modules.html new file mode 100644 index 000000000..abf753fd0 --- /dev/null +++ b/doc/v1.9.2/modules.html @@ -0,0 +1,80 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Modules + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    +
    + + + + 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_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/nb_connect_and_send.png b/doc/v1.9.2/nb_connect_and_send.png new file mode 100644 index 000000000..2bfaec2e1 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..4ce56aa7b 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..b29bdce34 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..0830f7650 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..a5197e3c2 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/search/all_0.html b/doc/v1.9.2/search/all_0.html new file mode 100644 index 000000000..1ec5b2d59 --- /dev/null +++ b/doc/v1.9.2/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..869f460ae --- /dev/null +++ b/doc/v1.9.2/search/all_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['addr_0',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['api_20version_1',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.9.2/search/all_1.html b/doc/v1.9.2/search/all_1.html new file mode 100644 index 000000000..9f80e9043 --- /dev/null +++ b/doc/v1.9.2/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..204c38c05 --- /dev/null +++ b/doc/v1.9.2/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_2',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.9.2/search/all_2.html b/doc/v1.9.2/search/all_2.html new file mode 100644 index 000000000..02cfffc2e --- /dev/null +++ b/doc/v1.9.2/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..d6a623719 --- /dev/null +++ b/doc/v1.9.2/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_3',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.9.2/search/all_3.html b/doc/v1.9.2/search/all_3.html new file mode 100644 index 000000000..39767b85b --- /dev/null +++ b/doc/v1.9.2/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..e908022ab --- /dev/null +++ b/doc/v1.9.2/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_4',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_5',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.9.2/search/all_4.html b/doc/v1.9.2/search/all_4.html new file mode 100644 index 000000000..fc40463c8 --- /dev/null +++ b/doc/v1.9.2/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..6d0e67254 --- /dev/null +++ b/doc/v1.9.2/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_6',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.9.2/search/all_5.html b/doc/v1.9.2/search/all_5.html new file mode 100644 index 000000000..9dd9344b0 --- /dev/null +++ b/doc/v1.9.2/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..4f4fb05a9 --- /dev/null +++ b/doc/v1.9.2/search/all_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_7',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.9.2/search/all_6.html b/doc/v1.9.2/search/all_6.html new file mode 100644 index 000000000..f1e516d75 --- /dev/null +++ b/doc/v1.9.2/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..6f8a0941a --- /dev/null +++ b/doc/v1.9.2/search/all_6.js @@ -0,0 +1,117 @@ +var searchData= +[ + ['xcm_2eh_8',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_9',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_10',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_2eh_11',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_12',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_13',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtcp_14',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_15',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_16',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_17',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_18',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_19',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_20',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_21',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_22',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_23',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_24',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_25',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_26',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_27',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_28',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_29',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_30',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_31',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_32',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_33',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_34',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_35',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_36',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_37',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_38',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_39',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_40',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_41',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_42',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_43',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_44',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_45',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_46',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_47',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_48',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_49',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_50',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_51',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_52',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_53',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_54',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_55',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_56',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_57',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_58',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_59',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_60',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_61',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_62',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_63',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_64',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_65',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_66',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_67',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_68',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_69',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_70',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_71',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_72',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_73',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_74',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_75',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtcp_5fproto_76',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_77',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_78',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_79',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_80',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_81',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_82',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_83',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_84',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_85',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_86',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_87',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_88',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_89',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5fnonblock_90',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_91',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_92',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_93',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_94',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_95',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_96',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_97',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_98',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_99',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_100',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_101',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_102',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_103',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_104',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_105',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_106',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_107',['XCM_VERSION',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_2eh_108',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_109',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_110',['XCM_VERSION_API',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_111',['XCM_VERSION_API_MAJOR',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_112',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_113',['XCM_VERSION_API_MINOR',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_114',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_115',['XCM_VERSION_MAJOR',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_116',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_117',['XCM_VERSION_MINOR',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_118',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_119',['XCM_VERSION_PATCH',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_120',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_121',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.9.2/search/classes_0.html b/doc/v1.9.2/search/classes_0.html new file mode 100644 index 000000000..af8159ee6 --- /dev/null +++ b/doc/v1.9.2/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..46c72b27b --- /dev/null +++ b/doc/v1.9.2/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_122',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_123',['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..a933eea1a --- /dev/null +++ b/doc/v1.9.2/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/doc/v1.9.2/search/defines_0.html b/doc/v1.9.2/search/defines_0.html new file mode 100644 index 000000000..15cc3de38 --- /dev/null +++ b/doc/v1.9.2/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..389129bd6 --- /dev/null +++ b/doc/v1.9.2/search/defines_0.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['xcm_5fbtcp_5fproto_219',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_220',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_221',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_222',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_223',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_224',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_225',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_226',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_227',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_228',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_229',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_230',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_231',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_232',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_233',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.9.2/search/enums_0.html b/doc/v1.9.2/search/enums_0.html new file mode 100644 index 000000000..141fff57b --- /dev/null +++ b/doc/v1.9.2/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..03d67d05f --- /dev/null +++ b/doc/v1.9.2/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_213',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.9.2/search/enumvalues_0.html b/doc/v1.9.2/search/enumvalues_0.html new file mode 100644 index 000000000..0d131d95b --- /dev/null +++ b/doc/v1.9.2/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..53a864a29 --- /dev/null +++ b/doc/v1.9.2/search/enumvalues_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_214',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_215',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_216',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_217',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_218',['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.html b/doc/v1.9.2/search/files_0.html new file mode 100644 index 000000000..9498842a6 --- /dev/null +++ b/doc/v1.9.2/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..339f551ed --- /dev/null +++ b/doc/v1.9.2/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_124',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_125',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_126',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_127',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_128',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_129',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_130',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/doc/v1.9.2/search/functions_0.html b/doc/v1.9.2/search/functions_0.html new file mode 100644 index 000000000..eb4c5014c --- /dev/null +++ b/doc/v1.9.2/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..5e38d5ab8 --- /dev/null +++ b/doc/v1.9.2/search/functions_0.js @@ -0,0 +1,78 @@ +var searchData= +[ + ['xcm_5faccept_131',['xcm_accept',['../xcm_8h.html#a4aa0ec85a7d80ba15141590924d3d9f4',1,'xcm.h']]], + ['xcm_5faccept_5fa_132',['xcm_accept_a',['../xcm_8h.html#af58a3b26327ccbbc68c77099b65c8fbd',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtcp_133',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_134',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_135',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_136',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_137',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_138',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_139',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_140',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_141',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_142',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_143',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_144',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_145',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_146',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_147',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_148',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_149',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_150',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_151',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_152',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_153',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_154',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_155',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_156',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_157',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_158',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_159',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_160',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_161',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_162',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_163',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_164',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#ab10963849707d25b122e5ff85c4e53be',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_165',['xcm_attr_map_create',['../xcm__attr__map_8h.html#ad8ffae21c128f9eeed5ee6d4511d9bef',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_166',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_167',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_168',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_169',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_170',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_171',['xcm_attr_map_get',['../xcm__attr__map_8h.html#a975791e51443f15311e36feb74754cdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_172',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a7c6b94f5846397ea232354f7b903fbdd',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_173',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a1afe0071afb66c0de4fff5642c17fcab',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_174',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#ad4e6dac29f82718e7172aa05d3e8f7ad',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_175',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#aa95eeacf871fbf356afe0c0207f390c5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_176',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab06b4ae855543bbad604f7566894cab6',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_177',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_178',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_179',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_180',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_181',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_182',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_183',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_184',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_185',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_186',['xcm_connect',['../xcm_8h.html#a24827752b7477ac91cdf5c43b2678ef6',1,'xcm.h']]], + ['xcm_5fconnect_5fa_187',['xcm_connect_a',['../xcm_8h.html#a59028dd77cf79ad8db3b7b166757f9fa',1,'xcm.h']]], + ['xcm_5ffd_188',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_189',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_190',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_191',['xcm_local_addr',['../xcm_8h.html#a4d8d62a9625b49993b7d6ec03de8e765',1,'xcm.h']]], + ['xcm_5freceive_192',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_193',['xcm_remote_addr',['../xcm_8h.html#ad52a0d86b7b5bf802835758cc9251e2e',1,'xcm.h']]], + ['xcm_5fsend_194',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_195',['xcm_server',['../xcm_8h.html#aa71d33a5fc550b9c1c4d5d6aee52b349',1,'xcm.h']]], + ['xcm_5fserver_5fa_196',['xcm_server_a',['../xcm_8h.html#aff1716340eafb1ddd766fffd178c3831',1,'xcm.h']]], + ['xcm_5fset_5fblocking_197',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_198',['xcm_version',['../xcm__version_8h.html#abe81cdc41275b32673f19a0290a8b640',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_199',['xcm_version_api',['../xcm__version_8h.html#a8aa63bd8beeddd5ea0f865340e7a8251',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_200',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_201',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_202',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_203',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_204',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_205',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.9.2/search/groups_0.html b/doc/v1.9.2/search/groups_0.html new file mode 100644 index 000000000..c600b4970 --- /dev/null +++ b/doc/v1.9.2/search/groups_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..7c795c8d6 --- /dev/null +++ b/doc/v1.9.2/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_234',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.9.2/search/groups_1.html b/doc/v1.9.2/search/groups_1.html new file mode 100644 index 000000000..2eb3550dc --- /dev/null +++ b/doc/v1.9.2/search/groups_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..bdfe1de90 --- /dev/null +++ b/doc/v1.9.2/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_235',['Library Version',['../group__lib__version.html',1,'']]] +]; 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..03626f64a --- /dev/null +++ b/doc/v1.9.2/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/doc/v1.9.2/search/nomatches.html b/doc/v1.9.2/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/doc/v1.9.2/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/doc/v1.9.2/search/pages_0.html b/doc/v1.9.2/search/pages_0.html new file mode 100644 index 000000000..8517b48f0 --- /dev/null +++ b/doc/v1.9.2/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + 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..04b117677 --- /dev/null +++ b/doc/v1.9.2/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_2doriented_20messaging_236',['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..9074198f8 --- /dev/null +++ b/doc/v1.9.2/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#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 { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#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 filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + 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 Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + 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 #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + 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: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + 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..fb226f734 --- /dev/null +++ b/doc/v1.9.2/search/search.js @@ -0,0 +1,816 @@ +/* + @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) + { + 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 resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- 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'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// 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 + { + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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 + { + parent.searchBox.CloseResultsWindow(); + parent.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() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.9.2/search/typedefs_0.js b/doc/v1.9.2/search/typedefs_0.js new file mode 100644 index 000000000..448720ea0 --- /dev/null +++ b/doc/v1.9.2/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5fattr_5fcb_211',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_212',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]] +]; diff --git a/doc/v1.9.2/search/variables_0.html b/doc/v1.9.2/search/variables_0.html new file mode 100644 index 000000000..1e477c08c --- /dev/null +++ b/doc/v1.9.2/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.9.2/search/variables_0.js b/doc/v1.9.2/search/variables_0.js new file mode 100644 index 000000000..7b6435276 --- /dev/null +++ b/doc/v1.9.2/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['addr_206',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.9.2/search/variables_1.html b/doc/v1.9.2/search/variables_1.html new file mode 100644 index 000000000..ea73d9a49 --- /dev/null +++ b/doc/v1.9.2/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.9.2/search/variables_1.js b/doc/v1.9.2/search/variables_1.js new file mode 100644 index 000000000..bf7bf9f9e --- /dev/null +++ b/doc/v1.9.2/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['family_207',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.9.2/search/variables_2.html b/doc/v1.9.2/search/variables_2.html new file mode 100644 index 000000000..0580462e9 --- /dev/null +++ b/doc/v1.9.2/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.9.2/search/variables_2.js b/doc/v1.9.2/search/variables_2.js new file mode 100644 index 000000000..08ecaf1cb --- /dev/null +++ b/doc/v1.9.2/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ip4_208',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_209',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]] +]; diff --git a/doc/v1.9.2/search/variables_3.html b/doc/v1.9.2/search/variables_3.html new file mode 100644 index 000000000..0d69e7619 --- /dev/null +++ b/doc/v1.9.2/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/doc/v1.9.2/search/variables_3.js b/doc/v1.9.2/search/variables_3.js new file mode 100644 index 000000000..df64ea794 --- /dev/null +++ b/doc/v1.9.2/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['type_210',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.9.2/server_accept.png b/doc/v1.9.2/server_accept.png new file mode 100644 index 000000000..f1ae8ad49 Binary files /dev/null and b/doc/v1.9.2/server_accept.png differ diff --git a/doc/v1.9.2/splitbar.png b/doc/v1.9.2/splitbar.png new file mode 100644 index 000000000..fe895f2c5 Binary files /dev/null and b/doc/v1.9.2/splitbar.png differ diff --git a/doc/v1.9.2/structxcm__addr__host.html b/doc/v1.9.2/structxcm__addr__host.html new file mode 100644 index 000000000..8f8ef650f --- /dev/null +++ b/doc/v1.9.2/structxcm__addr__host.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 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..9036dc0d4 --- /dev/null +++ b/doc/v1.9.2/structxcm__addr__ip.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    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 { ... } 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_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_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_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/tabs.css b/doc/v1.9.2/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /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}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.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:rgba(255,255,255,0.5);border-radius:5px}.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:rgba(162,162,162,0.1)}.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:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;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:url("tab_b.png");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:#283A5D 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:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff 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 #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;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 #555;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:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;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 #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 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:url("tab_b.png")}.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:#fff}} diff --git a/doc/v1.9.2/xcm_8h.html b/doc/v1.9.2/xcm_8h.html new file mode 100644 index 000000000..bd1485b63 --- /dev/null +++ b/doc/v1.9.2/xcm_8h.html @@ -0,0 +1,910 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..6caddac21 --- /dev/null +++ b/doc/v1.9.2/xcm_8h_source.html @@ -0,0 +1,167 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    1465 struct xcm_socket;
    +
    1466 
    +
    1519 struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1520 
    +
    1542 struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1543  const struct xcm_attr_map *attrs);
    +
    1544 
    +
    1580 struct xcm_socket *xcm_server(const char *local_addr);
    +
    1581 
    +
    1597 struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1598  const struct xcm_attr_map *attrs);
    +
    1599 
    +
    1616 int xcm_close(struct xcm_socket *socket);
    +
    1617 
    +
    1637 void xcm_cleanup(struct xcm_socket *socket);
    +
    1638 
    +
    1657 struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1658 
    +
    1678 struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1679  const struct xcm_attr_map *attrs);
    +
    1680 
    +
    1703 int xcm_send(struct xcm_socket *__restrict conn_socket,
    +
    1704  const void *__restrict buf, size_t len);
    +
    1705 
    +
    1729 int 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 
    +
    1801 int xcm_await(struct xcm_socket *socket, int condition);
    +
    1802 
    +
    1850 int xcm_fd(struct xcm_socket *socket);
    +
    1851 
    +
    1897 int xcm_finish(struct xcm_socket *socket);
    +
    1898 
    +
    1939 int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1940 
    +
    1955 bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1956 
    +
    1973 const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1974 
    +
    1989 const 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)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    int xcm_receive(struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *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)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    int xcm_send(struct xcm_socket *__restrict conn_socket, const void *__restrict 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_server_a(const char *local_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.9.2/xcm__addr_8h.html b/doc/v1.9.2/xcm__addr_8h.html new file mode 100644 index 000000000..61511a8ac --- /dev/null +++ b/doc/v1.9.2/xcm__addr_8h.html @@ -0,0 +1,1200 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..d81e176fc --- /dev/null +++ b/doc/v1.9.2/xcm__addr_8h_source.html @@ -0,0 +1,208 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    46 enum 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];
    +
    65  } addr;
    +
    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 
    +
    95 int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    96 
    +
    110 int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    111  uint16_t *port);
    +
    112 
    +
    126 int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    127  uint16_t *port);
    +
    128 
    +
    143 int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    144  uint16_t *port);
    +
    145 
    +
    160 int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    161  uint16_t *port);
    +
    162 
    +
    176 int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    177 
    +
    191 int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    192  size_t capacity);
    +
    193 
    +
    207 int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host,
    +
    208  uint16_t *port);
    +
    209 
    +
    223 int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    224  uint16_t *port);
    +
    225 
    +
    241 int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    242  char *utls_addr_s, size_t capacity);
    +
    243 
    +
    259 int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    260  char *tls_addr_s, size_t capacity);
    +
    261 
    +
    277 int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    278  char *tcp_addr_s, size_t capacity);
    +
    279 
    +
    295 int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    296  char *sctp_addr_s, size_t capacity);
    +
    297 
    +
    312 int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    313 
    +
    328 int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    329 
    +
    345 int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port,
    +
    346  char *btcp_addr_s, size_t capacity);
    +
    347 
    +
    363 int 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..0da43fe0c --- /dev/null +++ b/doc/v1.9.2/xcm__attr_8h.html @@ -0,0 +1,774 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..ca2b1578d --- /dev/null +++ b/doc/v1.9.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) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    18 #include <stdbool.h>
    +
    19 #include <xcm.h>
    +
    20 #include <xcm_attr_types.h>
    +
    21 
    +
    44 int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45  enum xcm_attr_type type, const void *value, size_t len);
    +
    46 
    +
    59 int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60 
    +
    73 int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74  int64_t value);
    +
    75 
    +
    88 int xcm_attr_set_double(struct xcm_socket *socket, const char *name,
    +
    89  double value);
    +
    90 
    +
    103 int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    104  const char *value);
    +
    105 
    +
    131 int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    132  enum xcm_attr_type *type, void *value, size_t capacity);
    +
    133 
    +
    150 int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    151  bool *value);
    +
    152 
    +
    169 int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    170  int64_t *value);
    +
    171 
    +
    188 int xcm_attr_get_double(struct xcm_socket *socket, const char *name,
    +
    189  double *value);
    +
    190 
    +
    209 int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    210  char *value, size_t capacity);
    +
    211 
    +
    229 int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    230  void *value, size_t capacity);
    +
    231 
    +
    233 typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    234  void *value, size_t value_len, void *cb_data);
    +
    235 
    +
    249 void 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..43e6a89d8 --- /dev/null +++ b/doc/v1.9.2/xcm__attr__map_8h.html @@ -0,0 +1,985 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..d03a5da20 --- /dev/null +++ b/doc/v1.9.2/xcm__attr__map_8h_source.html @@ -0,0 +1,211 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    +
    23 #include <xcm_attr_types.h>
    +
    24 
    +
    25 #include <stdbool.h>
    +
    26 #include <stddef.h>
    +
    27 #include <stdint.h>
    +
    28 
    +
    29 struct xcm_attr_map;
    +
    30 
    +
    31 
    +
    37 struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38 
    +
    39 
    +
    47 struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48 
    +
    66 void 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 
    +
    80 void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81  const char *attr_name, bool attr_value);
    +
    82 
    +
    83 
    +
    93 void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94  const char *attr_name, int64_t attr_value);
    +
    95 
    +
    96 
    +
    106 void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107  const char *attr_name, double attr_value);
    +
    108 
    +
    109 
    +
    119 void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120  const char *attr_name, const char *attr_value);
    +
    121 
    +
    122 
    +
    132 void 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 
    +
    146 void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147  const struct xcm_attr_map *src_map);
    +
    148 
    +
    149 
    +
    166 const 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 
    +
    186 const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187  const char *attr_name);
    +
    188 
    +
    189 
    +
    204 const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205  const char *attr_name);
    +
    206 
    +
    207 
    +
    222 const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223  const char *attr_name);
    +
    224 
    +
    225 
    +
    240 const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241  const char *attr_name);
    +
    242 
    +
    257 const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258  const char *attr_name);
    +
    259 
    +
    268 bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269  const char *attr_name);
    +
    270 
    +
    271 
    +
    280 void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281 
    +
    282 
    +
    290 size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291 
    +
    292 
    +
    296 typedef 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 
    +
    315 void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316  xcm_attr_map_foreach_cb cb, void *user);
    +
    317 
    +
    318 
    +
    327 bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328  const struct xcm_attr_map *attr_map_b);
    +
    329 
    +
    338 void 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)
    +
    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)
    +
    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_bin(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)
    +
    const int64_t * xcm_attr_map_get_int64(const 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)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    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)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    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)
    +
    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..127d36cec --- /dev/null +++ b/doc/v1.9.2/xcm__attr__types_8h.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..919a7edf8 --- /dev/null +++ b/doc/v1.9.2/xcm__attr__types_8h_source.html @@ -0,0 +1,107 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "C" {
    +
    10 #endif
    +
    11 
    + + + + + + +
    30 };
    +
    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..4defa4ae2 --- /dev/null +++ b/doc/v1.9.2/xcm__compat_8h.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..6fff0035f --- /dev/null +++ b/doc/v1.9.2/xcm__compat_8h_source.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    117 int 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..929366b23 --- /dev/null +++ b/doc/v1.9.2/xcm__version_8h.html @@ -0,0 +1,266 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    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..d5fb48263 --- /dev/null +++ b/doc/v1.9.2/xcm__version_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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
    +
    9 extern "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 
    +
    59 unsigned int xcm_version_major(void);
    +
    60 
    +
    67 unsigned int xcm_version_minor(void);
    +
    68 
    +
    74 unsigned int xcm_version_patch(void);
    +
    75 
    +
    84 const char *xcm_version(void);
    +
    85 
    +
    91 unsigned int xcm_version_api_major(void);
    +
    92 
    +
    98 unsigned int xcm_version_api_minor(void);
    +
    99 
    +
    108 const char *xcm_version_api(void);
    +
    109 
    +
    110 #ifdef __cplusplus
    +
    111 }
    +
    112 #endif
    +
    113 #endif
    +
    unsigned int xcm_version_major(void)
    +
    const char * xcm_version_api(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)
    +
    + + + +